CF 1743C - Save the Magazines(简单DP)
C - Save the Magazines(简单DP)
题意
现在有n个盖子,每个盖子下面有权值,当盖子盖着的时候,这个权值就会成为你的贡献之一。对于每个盖子(除了第一个),你最多可以将其往前移动一次。给出原有的盖子的分布,请输出这个贡献的最大值。
思路
比赛的时候写的太慢,现在写个题解来总结一下思路。很明显,直接贪心是有后效性的,所以我们直接想到DP。对于每个盖子,可以往前移动或者不往前移动,还有一个区别就是这个地方本来有盖子,我们才能将其往前移动,不然不能。按照上面的思路直接递推过去就好了。
实现
当s[i]不为1的时候,
const int N = 200005;
int n;
int ar[N];
int f[N][2];
void solve()
{
string s;
cin >> n >> s;
s = '0' + s;
for(int i = 1; i <= n; i ++)
cin >> ar[i];
f[0][0] = f[0][1] = 0;
for(int i = 1; i <= n; i ++)
{
if(s[i] == '1')
{
f[i][1] = max(f[i - 1][0], f[i - 1][1]) + ar[i];
f[i][0] = f[i - 1][0] + ar[i - 1];
}
else
{
f[i][0] = f[i][1] = max(f[i - 1][0], f[i - 1][1]);
}
}
cout << max(f[n][0], f[n][1]) << '\n';
}
分类:
CodeForces
标签:
动态规划
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】