洛谷 1541 烏龜棋
阿新 • • 發佈:2018-08-31
org tro std 完成 != col code tps show
題目鏈接
題解:
放與不放的問題。很容易想到是dp。
根據題意,有四種棋子,總棋子數挺小的。
就很容易想到四種循環來看各種放與不放的方案可以的出來的最高得分。
用一個flag數組記錄每種棋子的數量,循環以flag數組1~4為邊界。
ans數組記錄最大ans值,
即:max(ans[i][j][k][q],ans[i-1][j][k][q]+num[get_power])
最後輸出各種方案完成之後的ans[flag[1]][flag[2]][flag[3]][flag[4]]。
代碼:
#include<iostream> int ans[41][41][41][41],num[351],flag[5],n,m,x; int main() { std::cin>>n>>m; std::cin>>num[1]; ans[0][0][0][0]=num[1]; for(int i=2; i<=n; i++) std::cin>>num[i]; for(int i=1; i<=m; i++) std::cin>>x,flag[x]++; for(int i=0; i<=flag[1]; i++)for(int j=0; j<=flag[2]; j++) for(int k=0; k<=flag[3]; k++) for(int q=0; q<=flag[4]; q++) { int get_power=1+i+j*2+k*3+q*4; if(i!=0) ans[i][j][k][q]=std::max(ans[i][j][k][q],ans[i-1][j][k][q]+num[get_power]);if(j!=0) ans[i][j][k][q]=std::max(ans[i][j][k][q],ans[i][j-1][k][q]+num[get_power]); if(k!=0) ans[i][j][k][q]=std::max(ans[i][j][k][q],ans[i][j][k-1][q]+num[get_power]); if(q!=0) ans[i][j][k][q]=std::max(ans[i][j][k][q],ans[i][j][k][q-1]+num[get_power]); } std::cout<<ans[flag[1]][flag[2]][flag[3]][flag[4]]; return 0; }
一世安寧
洛谷 1541 烏龜棋