乌龟棋

 


#include<bits/stdc++.h> using namespace std; int x,n,m,f[41][41][41][41],a[351],b[121],g[5]; int main(){ cin>>n>>m; for(int i=1;i<=n;i++) cin>>a[i]; for(int i=1;i<=m;i++) { cin>>x; g[x]++; } f[0][0][0][0]=a[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=1+i+2*j+3*k+4*l; if(i!=0) f[i][j][k][l]=max(f[i][j][k][l],f[i-1][j][k][l]+a[r]); if(j!=0) f[i][j][k][l]=max(f[i][j][k][l],f[i][j-1][k][l]+a[r]); if(k!=0) f[i][j][k][l]=max(f[i][j][k][l],f[i][j][k-1][l]+a[r]); if(l!=0) f[i][j][k][l]=max(f[i][j][k][l],f[i][j][k][l-1]+a[r]); } cout<<f[g[1]][g[2]][g[3]][g[4]];//记住,这道题虽然简单,但是需要从零开始计算,你不摸牌也是状态。 return 0; }
考试时:在考试时看到这道题我知道是动归,但完全没有思路,也找不到状态转移方程,真不知道那些做出来的人在考试时是怎么想到的。我做梦都没想到居然要用四重循环,而且思路还很简单。
考试后:简单来讲就是将四种牌的数量作为自己的状态,数量不同这一步到达的那个点也不同,不过到达的那个点不止要考虑四张牌的数量,由于他最开始便把起点1的数据给算了,所以需要在算走到哪里的时候需要加1。
然后就是我自己犯的一些小错误。当我看懂了思路自己编译完了后,出错了。与题解相比对很久,我才找到那隐藏的很深得错误,我是从1开始的循环,而因为平时做动归题大多这样也可以吧,就习惯了。但这一次它没有牌也算作状态,所以吃了个教训。
 
posted @ 2019-05-28 17:16  星星梦  阅读(126)  评论(0编辑  收藏  举报