Codeforces 900 E. Maximum Questions (DP,技巧)
题意:
给出一个长度为n只含有a和b还有‘?’的串s,且'?'可以被任意替换为a或b。再给出一个字符串t (奇数位上为a,偶数位上为b,所以在题目中只给出了t的长度m),现在要求保证t在s中出现的次数最多的情况下面,使用'?'最小的情况使用了几个问号。
题解:
拿到这个题目可以看出是DP,但是比较难以解决的就是如何确定在第i个位置时前面m个字符能够满足t,这里我看了别人的题解 ~。~哇,震惊!首先的话先对‘?’做前缀和,然后设置两个数组s[2]分别表示在第i个位置前面交叉字符串的长度,这样的话第i步结尾为a(?)满足交叉字符串的最大长度就等于第i-1步结尾为b(?)的长度加1;
res[i] = res[i-] + (vec[i]=='?'); // ?前缀和
if(vec[i] != 'a') s[][i] = s[][i-] + ;
if(vec[i] != 'b') s[][i] = s[][i-] + ;
这样我们就求出了每一步是否满足能够形成t的条件,就可以开始DP了。(如果第i步满足就判断dp[i-m]+1和dp[i-1])
#include<bits/stdc++.h>
using namespace std;
const int MAX_N = 1e5+;
char vec[MAX_N];
int res[MAX_N];
int s[][MAX_N];
int dp[MAX_N];
int cost[MAX_N];
int main()
{
int N,M,T;
memset(res,,sizeof(res));
scanf("%d%s%d",&N,vec+,&M); // 这里vec+1 可以把字符串赋予(1-n)
for(int i=; i<=N; i++)
{
res[i] = res[i-] + (vec[i]=='?');
if(vec[i] != 'a') s[][i] = s[][i-] + ;
if(vec[i] != 'b') s[][i] = s[][i-] + ;
if(s[M&][i] >= M)
{
dp[i] = dp[i-M]+;
cost[i] = cost[i-M] + res[i] - res[i-M];
}
else
{
dp[i] = dp[i-];
cost[i] = cost[i-];
}
if(dp[i] <= dp[i-])
{
if(dp[i] == dp[i-]) cost[i] = min(cost[i],cost[i-]);
else cost[i] = cost[i-];
}
}
cout<<cost[N]<<endl;
return ;
}
emmmm...这是cf大佬的写法~~ 也就比我短了一倍吧 @。@
#include<bits/stdc++.h>
#define N 100005
using namespace std;
char s[N];
int n,m,b[N],c[][N];
pair<int,int> f[N];
int main(){
scanf("%d%s%d",&n,s+,&m);
for (int i=;i<=n;i++){
b[i]=b[i-]+(s[i]=='?');
if (s[i]!='a') c[][i]=c[][i-]+;
if (s[i]!='b') c[][i]=c[][i-]+;
if (c[m&][i]>=m) f[i]=make_pair(f[i-m].first+,f[i-m].second-b[i]+b[i-m]);
f[i]=max(f[i],f[i-]);
}
printf("%d\n",-f[n].second);
}
Codeforces 900 E. Maximum Questions (DP,技巧)的更多相关文章
- [文文殿下]基本的DP技巧
. 二进制状态压缩动态规划 对于某些情况,如果题目中所给的限制数目比较小,我们可以尝试状态压缩动态规划.例如,题目中给出数据范围\(n<=20\),这个一般情况下是一个状压DP的提示. 状态压缩 ...
- [BZOJ 3625] [Codeforces 438E] 小朋友的二叉树 (DP+生成函数+多项式开根+多项式求逆)
[BZOJ 3625] [Codeforces 438E] 小朋友的二叉树 (DP+生成函数+多项式开根+多项式求逆) 题面 一棵二叉树的所有点的点权都是给定的集合中的一个数. 让你求出1到m中所有权 ...
- Maximum Questions CodeForces - 900E (字符串,dp)
大意:给定长$n$的字符串$s$, 只含'a','b','?', '?'可以替换为任意字符, 在给定长$t$的字符串, "ababab...", 求替换尽量少的'?', 使得$s$ ...
- Two Melodies CodeForces - 813D (DP,技巧)
https://codeforces.com/problemset/problem/813/D dp[i][j] = 一条链以i结尾, 另一条链以j结尾的最大值 关键要保证转移时两条链不能相交 #in ...
- Codeforces 702A Maximum Increase(dp)
题目链接:http://codeforces.com/problemset/problem/702/A 题意: 给你N个数,a[0], a[1], a[2], ....., a[n-1],让你找出最长 ...
- Educational Codeforces Round 17 D. Maximum path DP
题目链接:http://codeforces.com/contest/762/problem/D 多多分析状态:这个很明了 #include<bits/stdc++.h> using na ...
- Codeforces Round #445 Div. 1 C Maximum Element (dp + 组合数学)
题目链接: http://codeforces.com/contest/889/problem/C 题意: 给你 \(n\)和 \(k\). 让你找一种全排列长度为\(n\)的 \(p\),满足存在下 ...
- codeforces 762 D. Maximum path(dp)
题目链接:http://codeforces.com/problemset/problem/762/D 题意:给出一个3*n的矩阵然后问从左上角到右下角最大权值是多少,而且每一个点可以走上下左右,但是 ...
- CodeForces 173C Spiral Maximum 记忆化搜索 滚动数组优化
Spiral Maximum 题目连接: http://codeforces.com/problemset/problem/173/C Description Let's consider a k × ...
随机推荐
- 前端之 HTML🎃
HTML这知识点很多很杂,所以整理很乱.所以将就看.
- 用 CSS3 做一个流星雨动画
昨天 UI 提交过来一个登录页的设计稿,要求背景有一个流星雨动画,做完之后觉得挺有趣,分享一下~ 一.流星动画 首先创建一个 div 作为画布 <div id="stars" ...
- 企业网盘: Owncloud 搭建
说明:搭建很简单,就是一个lamp环境,但是最新的owncloud 9.x版本对php的版本需求不能低于5.4, 所以需要下载yum源来进行安装. 搭建过程 1)配置yum源 rpm -Uvh htt ...
- TPYBoard v102 驱动28BYJ-48步进电机
TPYBoard v102 驱动28BYJ-48步进电机 实验目的 了解步进电机的工作原理 学习步进电机的驱动方法 实验器材 TPYBoard v102 1块 微型步进电机(28BYJ-48) 1个 ...
- margin负值的作用
一.左右负margin改变自身宽度 当元素不存在width或者width:auto的时候,负margin会增加元素的宽度. html <div class="parent"& ...
- PHP正在进行时-变量
在PHP中,变量是$+变量名,变量名遵循标识符的命名规则,可以以字母.下划线开头,可以由数字.下划线.字母组成合法的变量名. 变量声明 所有变量在使用之前应该进行声明,而且最好带上注释,虽然在PHP中 ...
- js 实现复制剪切
原生js实现复制 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> < ...
- mac 上安装服务,查看服务,重启和关闭
首先了解下的Mac的 homebrew ,官网:https://brew.sh/index_zh-cn.html 简单的说: Homebrew 能干什么? 答:使用 Homebrew 安装 Apple ...
- 简单的基于hash和hashchange的前端路由
hash定义 hash这个玩意是地址栏上#及后面部分,代表网页中的一个位置,#后面部分为位置标识符.页面打开后,会自动滚动到指定位置处. 位置标识符 ,一是使用锚点,比如<a name=&quo ...
- SRM13
由于种种原因,好像出了点锅……? 好在问题不是很大. 得分比我估的要低啊. 木之本樱 计算几何送分题 就是叫你求一共有多少组四线共点,O(n^4)暴力可以过初.枚举两条线,求出交点之后求有多少条直线过 ...