题解:P1541 [NOIP2010 提高组] 乌龟棋
kuaiCreator · · 题解
题目大意
给
解题思路
一眼动态规划,上动态规划六步分析法。
一、定义问题状态
题目中共计四种卡片,每种卡片的数量与得分之间有联系,状态非常好设计。
三、初始化边界状态
边界状态即为不需要计算就能直接分析出的状态。这里是一张卡片都没有用时得分为在第
四、计算顺序
从小到大依次枚举卡片
五、最终答案
其中
六、效率分析
时间复杂度和空间复杂度度都为
代码实现
#include<bits/stdc++.h>
using namespace std;
const int maxn = 10005;
int n, m, a[maxn], b, cnt[5], f[52][52][52][52];
int main(){
cin >> n >> m;
for(int i = 1; i <= n; i++)
cin >> a[i];
for(int i = 1; i <= m; i++){
cin >> b;
cnt[b]++;
}
f[0][0][0][0] = a[1];
for(int i = 0; i <= cnt[1]; i++)
for(int j = 0; j <= cnt[2]; j++)
for(int k = 0; k <= cnt[3]; k++)
for(int l = 0; l <= cnt[4]; l++){
int step = i+2*j+3*k+4*l+1;
if(i) f[i][j][k][l] = max(f[i][j][k][l], f[i-1][j][k][l] + a[step]);
if(j) f[i][j][k][l] = max(f[i][j][k][l], f[i][j-1][k][l] + a[step]);
if(k) f[i][j][k][l] = max(f[i][j][k][l], f[i][j][k-1][l] + a[step]);
if(l) f[i][j][k][l] = max(f[i][j][k][l], f[i][j][k][l-1] + a[step]);
}
cout << f[cnt[1]][cnt[2]][cnt[3]][cnt[4]];
return 0;
}