输入样例1
9 5
6 10 14 2 8 8 18 5 17
1 3 1 2 1
输入样例2
13 8
4 96 10 64 55 13 94 53 5 24 89 8 30
1 1 1 1 1 2 4 1
输出样例1
73
输出样例2
455
f[i][j][k][l]表示用了i张第一种,j张第二种,k张第三种,l张第四种卡片的最大得分
所到的格子是可以算出来的
【代码】#include<iostream> #include<cstring> #include<cstdio> using namespace std; int s[400],f[50][50][50][50],a,b,c,d,x,n,m; int main(){ scanf("%d%d",&n,&m); for (int i=0;i<n;++i) scanf("%d",&s[i]); for (int i=1;i<=m;++i){ scanf("%d",&x); switch(x){ case 1: a++; break; case 2: b++; break; case 3: c++; break; case 4: d++; break; } } for (int i=0;i<=a;++i) for (int j=0;j<=b;++j) for (int k=0;k<=c;++k) for (int l=0;l<=d;++l) { if (i!=0) f[i][j][k][l]=max(f[i][j][k][l],f[i-1][j][k][l]); if (j!=0) f[i][j][k][l]=max(f[i][j][k][l],f[i][j-1][k][l]); if (k!=0) f[i][j][k][l]=max(f[i][j][k][l],f[i][j][k-1][l]); if (l!=0) f[i][j][k][l]=max(f[i][j][k][l],f[i][j][k][l-1]); f[i][j][k][l]+=s[i+j*2+k*3+l*4]; } printf("%d",f[a][b][c][d]); }