题目链接: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. 前端学习_01_css网页布局

    引子 之前也自己陆陆续续地学了一些web方面的知识,包括前段和后端都有涉及到,自己也比较感兴趣,感谢peter老师,愿意无偿提供从零开始的教学,之前也看过peter老师的一些视频,节奏非常适合我,决心 ...

  2. vue2.0表单事件的绑定

    v-model 1.input type="text" <template> <div id="app"> <label for= ...

  3. Linux下查找文件的方法

    在Linux环境下查找一个文件的方法:find 路径 -name 'filename',filename不清楚全名的话可以用*号进行匹配,如“tomcat.*”.如果不清楚路径的话可以用"/ ...

  4. Nginx优化use参数epoll,kqueue,rtsig,eventport,poll

    转自:http://blog.sina.com.cn/s/blog_5eaf88f10100gkrq.html Nginx use参数分析对比 下图对比了poll select epoll和kqueu ...

  5. 部署Tomcat服务时,解决Cannot invoke Tomcat Manager 异常

    最近,在使用Jenkins对工程一键部署的时候,出现调用Tomcat Manager 异常,对其解决方案特记于次. 异常信息 可能存在的异常:(1)Cannot invoke Tomcat manag ...

  6. JAVA学习知识点汇总

    异常处理 1.在异常处理中,如果子类覆盖了父类的一个方法,子类方法中声明的已检查异常不能比父类方法声明的异常更通用,即子类方法可以抛出更特定的异常(不超过父类方法声明的异常范围,即由父类方法声明异常派 ...

  7. .net core .net standard .net framework

    由于对微软的技术比较感兴趣,所以最近就在研究用Visual Studio Code开发一个Asp.net core项目并且准备从后端开始干起. 一开始用dotnet new console创建了一个控 ...

  8. 【转】 Git——如何将本地项目提交至远程仓库

    1.(先进入项目文件夹)通过命令 git init 把这个目录变成git可以管理的仓库 git init 2.把文件添加到版本库中,使用命令 git add .添加到暂存区里面去,不要忘记后面的小数点 ...

  9. JQuery 网页瞄点

    $("html,body").animate({ scrollTop: $("#Content1").offset().top }, 3000); 代码说明:h ...

  10. Appium dmg 安装:[TypeError: Cannot read property 'replace' of undefined]

    问题原因:appium dmg 版本没有默认node.js 解决方案:安装稳定版的node.js.(官网下载安装即可.) 验证:命令行输入:node -v  查看版本号 npm -v  查看版本号