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 ",dp[card[1]][card[2]][card[3]][card[4]]); return 0; }