[AtCoder Code Festival 2017 QualB D/At3575] 101 to 010 - dp
[Atcoder Code Festival 2017 QualB/At3575] 101 to 010
有一个01序列,每次可以选出一个101,使其变成010,问最优策略下能操作几次?
考虑像 1111101 或者 1011111 这样的东西,它们最多能被操作的次数为长度-2
设\(l[i]\) 表示 \(i\) 左边第一个 \(0\) 的位置
设 \(f[i]\) 表示前缀的最大操作数
对于每个 \(a[i]=1\) 的位置,我们考虑进行转移
对于 \([i-2,i]\) 为 101 的情况,
- 对类似100 | 1111101这种,我们得到
\[f[i] \leftarrow f[l[i-2]] + i-l[i-2]-2
\]- 对于类似 11101| 11101 这种,我们得到
\[f[i] \leftarrow f[l[i-2]+1] +i-(l[i-2]+1)-2
\]否则,考虑类似 1011111 这样的情况,这时 \(l[i]>1, a[l[i]-1]=1\),我们得到
\[f[i] \leftarrow f[l[i]-2] +i-l[i]+2-2
\]
#include <bits/stdc++.h>
using namespace std;
const int N = 1000005;
char s[N];
int n,l[N],f[N];
int main() {
scanf("%d%s",&n,s+1);
for(int i=1;i<=n;i++) {
if(s[i]=='0') l[i]=i;
else l[i]=l[i-1];
}
for(int i=1;i<=n;i++) {
f[i]=f[i-1];
if(s[i]=='1') {
if(s[i-2]=='1' && s[i-1]=='0')
f[i]=max(f[i],max(f[l[i-2]]+i-l[i-2]-2,f[l[i-2]+1]+i-l[i-2]-3));
else if(l[i]>1 && s[l[i]-1]=='1') f[i]=max(f[i],f[l[i]-2]+i-l[i]);
}
}
cout<<f[n];
}
[AtCoder Code Festival 2017 QualB D/At3575] 101 to 010 - dp的更多相关文章
- Atcoder CODE FESTIVAL 2017 qual B D - 101 to 010 dp
题目链接 题意 对于一个\(01\)串,如果其中存在子串\(101\),则可以将它变成\(010\). 问最多能进行多少次这样的操作. 思路 官方题解 转化 倒过来考虑. 考虑,最终得到的串中的\(' ...
- 题解【AtCoder - CODE FESTIVAL 2017 qual B - D - 101 to 010】
题目:https://atcoder.jp/contests/code-festival-2017-qualb/tasks/code_festival_2017_qualb_d 题意:给一个 01 串 ...
- CODE FESTIVAL 2017 qual B D 101 to 010(dp)
除非人品好,能碰巧想到思路,否则基本是做不出来dp的,除了那几个经典的dp模型.. 看了几个前几名的代码,还是t神的代码比较清晰.膜tourist 代码的思路和题解思路基本一致..... #inclu ...
- [AtCoder Code Festival 2017 QualB C/At3574] 3 Steps - 二分图染色,结论
给你一个n个点m条边的无向图,进行以下操作 如果存在两个点u和v,使得从u走三步能恰好到达v,那么在u和v之间连接一条边 重复这个操作直到不能再连接新的边,问最后有多少条边? n, m <= 1 ...
- 101 to 010 Atcoder CODE FESTIVAL 2017 qual B D
https://www.luogu.org/problemnew/show/AT3575 题解 根本不会.. 错误记录:缺少32行的转移.显然这个转移是必要的 #include<cstdio&g ...
- 【题解】Popping Balls AtCoder Code Festival 2017 qual B E 组合计数
蒟蒻__stdcall终于更新博客辣~ 一下午+一晚上=一道计数题QAQ 为什么计数题都这么玄学啊QAQ Prelude 题目链接:这里是传送门= ̄ω ̄= 下面我将分几个步骤讲一下这个题的做法,大家不 ...
- AtCoder Code Festival 2017 Team Relay J - Indifferent
题目大意:共$2n$个价格$p_i$.两人轮流取.你每次取最大的,对方每次随机取.问你取的期望和是多少. 题解:从小到大排序,$\sum\limits_{i=0}^{2n-1} \frac{i*p_i ...
- atcoder/CODE FESTIVAL 2017 qual B/B(dfs染色判断是否为二分图)
题目链接:http://code-festival-2017-qualb.contest.atcoder.jp/tasks/code_festival_2017_qualb_c 题意:给出一个含 n ...
- Atcoder CODE FESTIVAL 2017 qual C D - Yet Another Palindrome Partitioning 回文串划分
题目链接 题意 给定一个字符串(长度\(\leq 2e5\)),将其划分成尽量少的段,使得每段内重新排列后可以成为一个回文串. 题解 分析 每段内重新排列后是一个回文串\(\rightarrow\)该 ...
随机推荐
- 准备工作-Visual Studio 安装
说明 网上很多安装教程,等到自己有时间的时候再写一篇自己安装的详细步骤 安装参考(网络) https://blog.csdn.net/qq_33485434/article/details/78454 ...
- 通过Java代码获取系统信息
在开发中,我们需要获取JVM中的信息,以及操作系统信息,内存信息,CPU信息,磁盘信息,网络信息等,通过Java的API不能获取内存等信息,需要sigar的第三方依赖包. ①:加入依赖 <dep ...
- C语言编写程序的大小端问题
有时候,用C语言写程序需要知道大端模式还是小端模式,,由于寄存器大于一个字节(8bit),就会存在一个字节安排的问题,例如(16bit)的short型,(32bit)的int型,具体需要看具体的编译器 ...
- 关于所学,及JNI问题
上周每天学习Java两个小时,随后两个小时里对教材上的例子进行验证,学会了如何使用Javac对文件进行终端编译,输出,但由于所下载的 jdk版本问题出现了JNI问题,正在尝试解决.并学会了如何使用ec ...
- beego的请求数据处理
我们经常需要获取用户传递的数据,包括 Get.POST 等方式的请求,beego 里面会自动解析这些数据,你可以通过如下方式获取数据: GetString(key string) string Get ...
- Chapter1 递归与递推
Chapter 1 递归与递推 时间复杂度(转载自yxc大佬) 一般ACM或者笔试题的时间限制是1秒或2秒. 在这种情况下,C++代码中的操作次数控制在 107107 为最佳. 下面给出在不同数据范围 ...
- Python集合详解
集合介绍: 集合(set)是一个无序的不重复元素序列.可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典 ...
- java 快速生成树的方式
public class XzqhDto { @ApiModelProperty("另加数据") private String label; @ApiModelProperty(& ...
- POJ 2431 Expedition 贪心 优先级队列
Expedition Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 30702 Accepted: 8457 Descr ...
- LVS负载均衡工作模式和调度算法
原文链接:https://blog.csdn.net/weixin_40470303/article/details/80541639 一.LVS简介 LVS(Linux Virtual Server ...