题目链接:900 E. Maximum Questions

题意:

  给出一个长度为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,技巧)的更多相关文章

  1. [文文殿下]基本的DP技巧

    . 二进制状态压缩动态规划 对于某些情况,如果题目中所给的限制数目比较小,我们可以尝试状态压缩动态规划.例如,题目中给出数据范围\(n<=20\),这个一般情况下是一个状压DP的提示. 状态压缩 ...

  2. [BZOJ 3625] [Codeforces 438E] 小朋友的二叉树 (DP+生成函数+多项式开根+多项式求逆)

    [BZOJ 3625] [Codeforces 438E] 小朋友的二叉树 (DP+生成函数+多项式开根+多项式求逆) 题面 一棵二叉树的所有点的点权都是给定的集合中的一个数. 让你求出1到m中所有权 ...

  3. Maximum Questions CodeForces - 900E (字符串,dp)

    大意:给定长$n$的字符串$s$, 只含'a','b','?', '?'可以替换为任意字符, 在给定长$t$的字符串, "ababab...", 求替换尽量少的'?', 使得$s$ ...

  4. Two Melodies CodeForces - 813D (DP,技巧)

    https://codeforces.com/problemset/problem/813/D dp[i][j] = 一条链以i结尾, 另一条链以j结尾的最大值 关键要保证转移时两条链不能相交 #in ...

  5. Codeforces 702A Maximum Increase(dp)

    题目链接:http://codeforces.com/problemset/problem/702/A 题意: 给你N个数,a[0], a[1], a[2], ....., a[n-1],让你找出最长 ...

  6. Educational Codeforces Round 17 D. Maximum path DP

    题目链接:http://codeforces.com/contest/762/problem/D 多多分析状态:这个很明了 #include<bits/stdc++.h> using na ...

  7. Codeforces Round #445 Div. 1 C Maximum Element (dp + 组合数学)

    题目链接: http://codeforces.com/contest/889/problem/C 题意: 给你 \(n\)和 \(k\). 让你找一种全排列长度为\(n\)的 \(p\),满足存在下 ...

  8. codeforces 762 D. Maximum path(dp)

    题目链接:http://codeforces.com/problemset/problem/762/D 题意:给出一个3*n的矩阵然后问从左上角到右下角最大权值是多少,而且每一个点可以走上下左右,但是 ...

  9. CodeForces 173C Spiral Maximum 记忆化搜索 滚动数组优化

    Spiral Maximum 题目连接: http://codeforces.com/problemset/problem/173/C Description Let's consider a k × ...

随机推荐

  1. leetcode — word-break-ii

    import java.util.*; /** * Source : https://oj.leetcode.com/problems/word-break-ii/ * * Given a strin ...

  2. Robot Framework学习笔记(五)------Collections 库

    Collections 库同样为 Robot Framework 标准类库,它所提供的关键字主要用于列表.索引.字典的处理. 1.添加类 在使用之前需要在测试套件(项目)中添加 2.创建字典 字典也是 ...

  3. idea创建Maven多模块项目

    最近几天学习到了创建多模块项目,应为自己使用的是Idea,所以想用idea创建多模块,查阅了相关资料后,自己做一个记录. 一.首先创建一个maven项目 Parent Project,创建xxx-ro ...

  4. 深入研究ES6 Generators

    ES6 Generators系列: ES6 Generators基本概念 深入研究ES6 Generators ES6 Generators的异步应用 ES6 Generators并发 如果你还不知道 ...

  5. Sql Server Configuration Manager 网络配置为空,没有实例

    新用户一天内不准提问...Sql Server Configuration Manager 网络配置为空,没有实例无法设置ip和端口进行连接..

  6. 巧用CSS居中未知高度的块元素

    在网页中让一个未知高度的块元素水平垂直居中是一个老生常谈的问题,但是总是有些特殊场景让你无法得心应手的实现居中,本文介绍几种常用的经典的居中方法,总有一种适合你! 1. position .paren ...

  7. Android 中adb 命令(实用)

    1. 用命令的方式打开关闭mtklog adb  shell am broadcast -a com.mediatek.mtklogger.ADB_CMD -e cmd_name start/stop ...

  8. jQuery Mobile Slider 禁用点击事件

    阿子原创,转载请注明出处. 在使用jQuery Mobile Slider时,发现在页面上下拖动时,很容易不小心触发Slider的点击事件,从而造成误操作.为此需要禁用Slider的点击事件. 官方A ...

  9. Repair MySQL 5.6 GTID replication by injecting empty transactions

    Since SQL_SLAVE_SKIP_COUNTER doesn’t work with GTID we need to find a way to ignore that transaction ...

  10. 《精通Linux C编程》1.3Linux系统的常用命令-笔记

    [toc] 1.3.1了解Shell Linux常用命令的运行环境就是Shell,它是一种命令解析器,在用户和操作系统之间提供了一个交互接口. 用户在命令行输入命令,然后Shell对该命令进行解析并将 ...