题解:
放与不放的问题。很容易想到是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; }
一世安宁