乌龟棋(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;
}

 

posted @ 2018-08-13 21:48  lmjer  阅读(144)  评论(0编辑  收藏  举报