CF 766C - Mahmoud and a Message (DP+字符串)
题目链接:
http://codeforces.com/problemset/problem/766/C
题目描述:
有一个只含小写字母的字符串,输入一个26个整数,用来限制每个字母所在字符串的最大长度,在保证符合限制的前提下。
- 输出分割字符串的方案数。
- 输出所有方案中,最少的分割次数。
- 输出所有方案中,最大的子串长度。
结题过程:
一开始打算放弃掉的,英文题,题目很长,看起来又比较麻烦。
然后学长来讲了一下,感觉毕竟讲都讲了,不做下挺可惜的,倒是个好题。
刚开始示例一直过不了,第二层循环字符串长度的时候出了问题,我用j表示到那一个字符了,后来发现用j代表分隔符的位置更好。
题目分析:
- 首先确定状态,很明显字符串处理经常用长度做状态,无后效性。
接下来是确定状态转移方程:
先说下第二层循环,这里j代表分隔符的所在位置,位于第j个字符的前方。
用一个变量用来标记当前最小的长度限制,如果 i - j + 1 > limit 就跳出循环。
最后虽然 j = -1 的时候退出循环,但是要给方案数加一,整个字符串可以不用分割。方案次数:dpNum[i] += dpNum[j-1] , 0 < j <= i.
最少子串数:dpMinNum[i] = min(dpMinNum[j-1]+1, dpMinNum[i]).
- 最长子串数,只需一直用 j 来更新最大长度 ansLen 就好了。
最后注意一下初始化。
AC代码:
#include<bits/stdc++.h>
using namespace std;const long long MOD = 1e9+7;int main()
{int n;scanf("%d", &n);char data[1123];int maxLen[30];scanf("%s", data);long long dpNum[1123], dpMinNum[1123], ansLen = 1;for (int i = 0; i < 26; i++)scanf("%d", maxLen+i);dpMinNum[0] = 1;dpNum[0] = 1;for (int i = 1; i < n; i++){dpMinNum[i] = n;dpNum[i] = 0;int limit = n;int j;for (j = i; j >= 0; j--){limit = min(maxLen[data[j]-'a'], limit);if (i-j+1 > limit)break;if (!i)continue;dpMinNum[i] = min(dpMinNum[j-1]+1, dpMinNum[i]);ansLen = max(ansLen, (long long)i-j+1);dpNum[i] = (dpNum[i]%MOD + dpNum[j-1]%MOD)%MOD;}if (j == -1)dpNum[i]+=1;}printf("%lld\n%lld\n%lld\n", dpNum[n-1], ansLen, dpMinNum[n-1]);
}
转载于:https://www.cnblogs.com/ACMFish/p/6403465.html
CF 766C - Mahmoud and a Message (DP+字符串)相关推荐
- CodeForces - 766C - Mahmoud and a Message dp
题意 给出一个字符串 和每个字符的限制数量ai 让我们随意的切割成多个字符串 使得每一个字符串中的特定字符所在的子串长度len<=ai 求一共有多少个符合题目要求的方案 求其中最长的一个串长度是 ...
- 766C - Mahmoud and a Message(dp)
https://codeforces.com/problemset/problem/766/C 有一个长度为n的字符串,第二行有26个数字,位置1~26对应为a~z的字母,数值表示该字母不能出现在长度 ...
- codeforces 766 C Mahmoud and a Message
题目链接:http://codeforces.com/contest/766/problem/C 题目: Mahmoud wrote a message s of length n. He wants ...
- 【CF 149D】Coloring Brackets(dp)
[CF 149D]Coloring Brackets(dp) D. Coloring Brackets time limit per test 2 seconds memory limit per t ...
- 动态规划 —— 线性 DP —— 字符串编辑距离
[概述] 字符串编辑距离,即 Levenshtein 距离,是俄国科学家 Vladimir Levenshtein 提出的概念,是指从一个字符串修改到另一个字符串时,编辑单个字符所需的最少次数,编辑单 ...
- POJ 2817 状态DP 字符串找最多的重复
题意: 给出字符串个数 n 给出n串字符串 找出上下两个字符串重复和最多的个数.. eg: 5 abc bcd cde aaa bfcde 0根据 aaa abc bcd cde bfcde答案就是重 ...
- 8.6 edu25 ,577#div2 CF补题(二分 ,dp 与 贪心
两道题 1.edu 25 D. Suitable Replacement 题意:给定字符串s,t,s中'?'字符可以以任何字符替换,问如何替换 可使 替换后的s重新排序与t的匹配次数最多(len_t& ...
- hdu 1159(DP+字符串最长公共序列)
http://blog.csdn.net/a_eagle/article/details/7213236 公共序列可以用一个二维数组dp[i][j]保存每个点时的最大数字,本质就是一个双向比较. dp ...
- 蓝桥杯 算法训练 Cowboys By Assassin dp+字符串操作
问题描述一个间不容发的时刻:n个牛仔站立于一个环中,并且每个牛仔都用左轮手枪指着他旁边的人!每个牛仔指着他顺时针或者逆时针方向上的相邻的人.正如很多西部片那样,在这一刻,绳命是入刺的不可惜--对峙的场 ...
- Educational Codeforces Round 80 (Rated for Div. 2)SZU cf集训round2 C~E(dp,状压+二分,树状数组+逆向思维)
C. Two Arrays 题目大意:就是给定两个整数n和m.计算数组对的数量(a,b),使得: 1 .两个阵列的长度都等于m: 2 .每个数组的每个元素都是1到n(包括1和n)之间的整数: 从1到m ...
最新文章
- 吃瓜腾讯平均月薪7.27万后,微信又出大招
- mysql 终止 存储过程
- 深度学习(三十二)——AlphaGo, AlphaStar
- c语言最简单的程序编写,C语言简单程序编写.doc
- Java游戏用户登录注册_Java实现多用户注册登录的幸运抽奖
- python安装lzo_hadoop-lzo 安装配置
- HTML5 — 知识篇总结《II》【HTML5大力支持的语义化思想与规范】
- jenkins忘记密码和常用插件的下载
- 科技部正式发文:破除“唯论文”不良导向;网友:靠水论文拿奖励的人不开心了...
- android jni c调用java,Android JNI中C调用Java方法
- webpack 图片压缩
- namesilo续费
- 好玩的智力测试题-精品
- 项管行知02--工作环境
- 谷歌cloud_参加Google Cloud专业机器学习工程师考试的20天Beta
- Datawhale7月组队学习task1数据加载及探索性数据分析
- 模拟电路仿真LTspice(1):二极管特性曲线
- 【毕业设计】深度学习图像语义分割算法研究与实现 - python 机器视觉
- php如何读取文件,PHP如何读取文件内容?,懂得这些技巧就够了
- 修复win10的微软应用商店闪退
热门文章
- 进程的同步和互斥反映了_进程的同步和互斥
- python设置字符串的格式_Python中的字符串格式
- C++ const和static const的区别
- kubernetes视频教程笔记 (31)-安全-鉴权Authorization
- anaconda r 语言_Centos7系统下R、 Rstudio及sparklyr的安装与配置
- java 开关按钮_SwitchButton开关按钮的多种实现方式
- ubuntu设置始终亮屏_教你在Ubuntu系统下保存屏幕亮度设置
- modbus调试工具 linux,Modbus测试工具 :Modbus Poll,Modbus Slave
- Spring Boot 服务优雅关闭方式汇总, Spring Boot 打包排除指定文件
- Redis 常见问题 与 常见错误