题目
求通过走卡片的步数获得的最大得分(一开始在1,自动加上得分)
分析
长得挺像背包的,比较简单233
int now=1+i+j*2+k*3+p*4;
if (i) f[i][j][k][p]=max(f[i][j][k][p],f[i-1][j][k][p]+a[now]);
if (j) f[i][j][k][p]=max(f[i][j][k][p],f[i][j-1][k][p]+a[now]);
if (k) f[i][j][k][p]=max(f[i][j][k][p],f[i][j][k-1][p]+a[now]);
if (p) f[i][j][k][p]=max(f[i][j][k][p],f[i][j][k][p-1]+a[now]);
代码
#include <cstdio>
#include <cctype>
#define max(a,b) (a>b)?a:b
using namespace std;
typedef unsigned short ust;
ust n,m,a[351],num[4],f[41][41][41][41];
ust in(){
ust ans=0; char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=ans*10+c-48,c=getchar();
return ans;
}
int main(){
n=in(); m=in();
for (int i=1;i<=n;i++) a[i]=in();
for (int i=1;i<=m;i++) num[in()-1]++;
f[0][0][0][0]=a[1];
for (int i=0;i<=num[0];i++)
for (int j=0;j<=num[1];j++)
for (int k=0;k<=num[2];k++)
for (int p=0;p<=num[3];p++){
int now=1+i+j*2+k*3+p*4;
if (i) f[i][j][k][p]=max(f[i][j][k][p],f[i-1][j][k][p]+a[now]);
if (j) f[i][j][k][p]=max(f[i][j][k][p],f[i][j-1][k][p]+a[now]);
if (k) f[i][j][k][p]=max(f[i][j][k][p],f[i][j][k-1][p]+a[now]);
if (p) f[i][j][k][p]=max(f[i][j][k][p],f[i][j][k][p-1]+a[now]);
}
return !printf("%d",f[num[0]][num[1]][num[2]][num[3]]);
}