uva 10626 Buying Coke

奇怪的dp

四维的好想,dp[c][n1][n5][n10]即可,但是这种解法显然超时(4亿的int型数组还是可以开出的)

想不出解法,查看了凯哥的解题报告,原来c是可以略去的,出现了一个奇怪的边界:

n1+n2*5+n10*10==remain

虽然ac了,但是这题果然好奇怪啊。

#include<cstdio>

#include<cstring>

#include<iostream>

#define INF 0x3f3f3f3f

using namespace std;

int t,n,i,j,k;

int dp[701][151][51];

int DP(int i,int j,int k)

{

    if(dp[i][j][k]!=INF)

    return dp[i][j][k];

    if(i+j*5+k*10==n)

    return dp[i][j][k]=0;



    if(i>=8)

    dp[i][j][k]=min(dp[i][j][k],DP(i-8,j,k)+8);

    if(j>=2)

    dp[i][j][k]=min(dp[i][j][k],DP(i+2,j-2,k)+2);

    if(k>=1)

    dp[i][j][k]=min(dp[i][j][k],DP(i+2,j,k-1)+1);



    if(i>=3&&j>=1)

    dp[i][j][k]=min(dp[i][j][k],DP(i-3,j-1,k)+4);

    if(i>=3&&k>=1)

    dp[i][j][k]=min(dp[i][j][k],DP(i-3,j+1,k-1)+4);

    return dp[i][j][k];

}

int main()

{

   scanf("%d",&t);

   while(t--)

   {

       memset(dp,INF,sizeof(dp));

       scanf("%d%d%d%d",&n,&i,&j,&k);

       n=i+j*5+k*10-n*8;

       printf("%d\n",DP(i,j,k));

   }

   return 0;

}

你可能感兴趣的:(uva)