洛谷P1541乌龟棋
动归,四位数组存每一张牌的最优解,num数组用来存棋盘,上代码。
#include<bits/stdc++.h>
using namespace std;
int n,m,num[400],f[42][42][42][42],r,g[5];
int main()
{
int i,j,k,l,t,a,b;
scanf("%d%d",&n,&m);
for(a=1;a<=n;a++)
scanf("%d",&num[a]);
for(b=1;b<=m;b++)
{
scanf("%d",&t);
g[t]++;
}
f[0][0][0][0]=num[1];
for(i=0;i<=g[1];i++)
for(j=0;j<=g[2];j++)
for(k=0;k<=g[3];k++)
for(l=0;l<=g[4];l++)
{
r=1+i+j*2+k*3+l*4;//以下四句分别表示最后使用的那张牌之前的最优解,类似于背包问题
if(i!=0) f[i][j][k][l]=max(f[i][j][k][l],f[i-1][j][k][l]+num[r]);
if(j!=0) f[i][j][k][l]=max(f[i][j][k][l],f[i][j-1][k][l]+num[r]);
if(k!=0) f[i][j][k][l]=max(f[i][j][k][l],f[i][j][k-1][l]+num[r]);
if(l!=0) f[i][j][k][l]=max(f[i][j][k][l],f[i][j][k][l-1]+num[r]);
}
printf("%d",f[g[1]][g[2]][g[3]][g[4]]);
return 0;
}