烏龜棋【黃金題】【動態規劃】
阿新 • • 發佈:2019-01-22
我的思路是由len推導len+1層。
因為計算m個卡片最大值,需要知道m-1個卡片的最大值。(不知道網上其他人的演算法是怎麼理解的,感覺自己的演算法很耗時間)
#include<iostream> using namespace std; int dp[41][41][41][41]; int a[351]; int n,m,t; int mi=0,mj=0,mk=0,ml=0; int main(){ cin>>n>>m; for(int i=1;i<=n;i++){ cin>>a[i]; } int mt=m; while(mt--){ cin>>t; if(t==1){ ++mi; }else if(t==2){ ++mj; }else if(t==3){ ++mk; }else if(t==4){ ++ml; } } for(int len=0;len<=m;len++){ // cout<<"-----------------------"<<endl; // cout<<"len="<<len<<endl; for(int i=0;i<=len&&i<=mi;i++){ for(int j=0;j+i<=len&&j<=mj;j++){ for(int k=0;i+j+k<=len&&k<=mk;k++){ int l=len-i-j-k; if(l>ml)continue; // cout<<i<<" ";cout<<j<<" ";cout<<k<<" ";cout<<l<<" "; // cout<<dp[i][j][k][l]<<endl; int num=i*1+j*2+k*3+l*4+1; if(num+1<=n)dp[i+1][j][k][l]=max(dp[i+1][j][k][l],dp[i][j][k][l]+a[num+1]); if(num+2<=n)dp[i][j+1][k][l]=max(dp[i][j+1][k][l],dp[i][j][k][l]+a[num+2]); if(num+3<=n)dp[i][j][k+1][l]=max(dp[i][j][k+1][l],dp[i][j][k][l]+a[num+3]); if(num+4<=n)dp[i][j][k][l+1]=max(dp[i][j][k][l+1],dp[i][j][k][l]+a[num+4]); } } } } // for(int i=0;i<=mi;i++){ // for(int j=0;j<=mj;j++){ // for(int k=0;k<=mk;k++){ // for(int l=0;l<=ml;l++){ // cout<< // } // } // } // } cout<<dp[mi][mj][mk][ml]+a[1]<<endl; return 0; }