标签:思维题
考试的时候老是在想第一维是走到点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