1. 程式人生 > >洛谷 1541 烏龜棋

洛谷 1541 烏龜棋

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 烏龜棋