题目:乌龟棋
思路:
令f[i][j][k][u]表示四种棋子取的个数分别为i,j,k,u时的最大得分。
f[i][j][k][u]=max( f[i-1][j][k][u] , f[i][j-1][k][u] , f[i][j][k-1][u] , f[i][j][k][u-1] )
代码:
#include<bits/stdc++.h>
using namespace std;
#define maxn 350
#define maxm 40
#define f4 f[i][j][k][u]
#define num a[i+j*2+k*3+u*4+1]
int n,m;
int a[maxn+5],b[5]={0};
int f[maxm+5][maxm+5][maxm+5][maxm+5]={0};
void readin(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
for(int i=1;i<=m;i++){
int x;
scanf("%d",&x);
b[x]++;
}
}
int dp(){
f[0][0][0][0]=a[1];
for(int i=0;i<=b[1];i++)
for(int j=0;j<=b[2];j++)
for(int k=0;k<=b[3];k++)
for(int u=0;u<=b[4];u++){
if(i) f4=max(f4,f[i-1][j][k][u]+num);
if(j) f4=max(f4,f[i][j-1][k][u]+num);
if(k) f4=max(f4,f[i][j][k-1][u]+num);
if(u) f4=max(f4,f[i][j][k][u-1]+num);
}
return f[b[1]][b[2]][b[3]][b[4]];
}
int main(){
readin();
int ans=dp();
printf("%d",ans);
return 0;
}