乌龟棋(noip2010)
因为只有四种棋子,而且每种最多40颗,所以设dp[i][j][k][l],表示分别使用了i,j,k,l,颗1,2,3,4的棋子所获最大值
则方程为
int r=i+j*2+k*3+l*4+1;
if(i) dp[i][j][k][l]=max(dp[i][j][k][l],dp[i-1][j][k][l]+score[r]);
if(j) dp[i][j][k][l]=max(dp[i][j][k][l],dp[i][j-1][k][l]+score[r]);
if(k) dp[i][j][k][l]=max(dp[i][j][k][l],dp[i][j][k-1][l]+score[r]);
if(l) dp[i][j][k][l]=max(dp[i][j][k][l],dp[i][j][k][l-1]+score[r]);
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=42; int dp[maxn][maxn][maxn][maxn]; int g[10]; int score[1000]; int main(){ int n,m; scanf("%d%d",&n,&m); for (int i=1;i<=n;i++){ scanf("%d",&score[i]); } int q; for (int i=1;i<=m;i++){ scanf("%d",&q); g[q]++; } dp[0][0][0][0]=score[1]; for (int i=0;i<=g[1];i++) for (int j=0;j<=g[2];j++) for (int k=0;k<=g[3];k++) for (int l=0;l<=g[4];l++){ int r=i+j*2+k*3+l*4+1; if(i) dp[i][j][k][l]=max(dp[i][j][k][l],dp[i-1][j][k][l]+score[r]); if(j) dp[i][j][k][l]=max(dp[i][j][k][l],dp[i][j-1][k][l]+score[r]); if(k) dp[i][j][k][l]=max(dp[i][j][k][l],dp[i][j][k-1][l]+score[r]); if(l) dp[i][j][k][l]=max(dp[i][j][k][l],dp[i][j][k][l-1]+score[r]); } printf("%d\n",dp[g[1]][g[2]][g[3]][g[4]]); return 0; }