P1541 乌龟棋

99%的WA都是因为手残

P1541 乌龟棋

题解

这题可以用DP做

 

首先记录下棋盘上的分数,然后开一个数组记录每种卡片的数目

下面关键:

dp[ ][ ][ ][ ]  四维DP记录每种卡片各用了多少张时得到的最大分数

ans就是把所有卡片都用上时的分数啦

 

代码

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>

using namespace std;

int n,m;
int pan[355],card[5],dp[45][45][45][45];

int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
      scanf("%d",&pan[i]);
    for(int i=1;i<=m;i++)
    {
        int k;
        scanf("%d",&k);
        card[k]++;
    }
    
    dp[0][0][0][0]=pan[1];
    
    for(int i=0;i<=card[1];i++)
      for(int j=0;j<=card[2];j++)
        for(int k=0;k<=card[3];k++)
          for(int l=0;l<=card[4];l++)
          {
              int pos=1+i*1+j*2+k*3+l*4;  //用了这些卡片后走到的位置 
              if(i) dp[i][j][k][l]=max(dp[i][j][k][l],dp[i-1][j][k][l]+pan[pos]);
              if(j) dp[i][j][k][l]=max(dp[i][j][k][l],dp[i][j-1][k][l]+pan[pos]);
              if(k) dp[i][j][k][l]=max(dp[i][j][k][l],dp[i][j][k-1][l]+pan[pos]);
              if(l) dp[i][j][k][l]=max(dp[i][j][k][l],dp[i][j][k][l-1]+pan[pos]);
            //确保这种卡片数目不为0才可以选择,然后转移 
          }
    
    printf("%d\n",dp[card[1]][card[2]][card[3]][card[4]]);
    
    return 0;
}

 

posted @ 2019-07-08 14:55  晔子  阅读(218)  评论(0编辑  收藏  举报