考试的时候老是在想第一维是走到点i时候的最大值,然后没有考虑到这样可以计算出每种牌用了多少张。。。。。
dp[i][j][k][l]表示第一种牌用i张,第二种牌用j张,第三种牌用k张,第四种牌用l张的最大值
#include<cstdio> #include<iostream> #define MAXN 355 using namespace std; int c[5],a[MAXN],f[41][41][41][41]; int n,m; int main() { scanf("%d%d",&n,&m); int x; for(int i = 1; i <= n; i++) scanf("%d",&a[i]); for(int i = 1; i <= m; i++) { scanf("%d",&x); c[x]++; } f[0][0][0][0] = a[1]; f[1][0][0][0] = a[2]; f[0][1][0][0] = a[3]; f[0][0][1][0] = a[4]; f[0][0][0][1] = a[5]; for(int i = 0; i <= c[1]; i++) for(int j = 0; j <= c[2]; j++) for(int k = 0; k <= c[3]; k++) for(int l = 0; l <= c[4]; l++) { int w = i,x = j,y = k,z = l; if(w != 0) w = f[i-1][j][k][l]; if(x != 0) x = f[i][j-1][k][l]; if(y != 0) y = f[i][j][k-1][l]; if(z != 0) z = f[i][j][k][l-1]; int t = max(w,max(x,max(y,z))); f[i][j][k][l] = t + a[1+i+2*j+3*k+4*l]; } printf("%d\n",f[c[1]][c[2]][c[3]][c[4]]); }
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/cqbzwja/article/details/47705163