动态规划题解
2022-11-10 16:57:03
发布于:浙江
87阅读
0回复
0点赞
【题目标题】NOIP2010乌龟棋
【题目大意】
一行个格子,每个格子有一个权值。棋子一开始在起点,有张让棋子向前走的卡,分别是步、步、步、步。求用光所有卡后获得的最大权值。
数据保证用完张卡后刚好达到第格
【算法分析】
本题采用动态规划。
考虑记录使用完每种卡片具体张数后的得分情况。
设定变量,表示第个格子的分值。
设定变量, 表示用了张一步卡,张两步卡,张三步卡,张四步卡获得的最大分数。
则是由上一张使用的什么卡所决定,且已知的情况下,可求出位于哪一个格子。
则可得状态转移方程
初始状态为
【参考代码】
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int f[41][41][41][41], num[351], g[5], n, m, x;
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i++)
cin >> num[i];
f[0][0][0][0] = num[1];
for (int i = 1; i <= m; i++)
{
cin >> x;
g[x]++;
}
for (int a = 0; a <= g[1]; a++)
for (int b = 0; b <= g[2]; b++)
for (int c = 0; c <= g[3]; c++)
for (int d = 0; d <= g[4]; d++)
{
int r = 1 + a + b * 2 + c * 3 + d * 4;
if (a)
f[a][b][c][d] = max(f[a][b][c][d], num[r] + f[a - 1][b][c][d]);
if (b)
f[a][b][c][d] = max(f[a][b][c][d], num[r] + f[a][b - 1][c][d]);
if (c)
f[a][b][c][d] = max(f[a][b][c][d], num[r] + f[a][b][c - 1][d]);
if (d)
f[a][b][c][d] = max(f[a][b][c][d], num[r] + f[a][b][c][d - 1]);
}
cout << f[g[1]][g[2]][g[3]][g[4]];
return 0;
}
【时间复杂度】
,为卡片张数,
【预计得分】
这里空空如也
有帮助,赞一个