题目链接:


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+字符串)相关推荐

  1. CodeForces - 766C - Mahmoud and a Message dp

    题意 给出一个字符串 和每个字符的限制数量ai 让我们随意的切割成多个字符串 使得每一个字符串中的特定字符所在的子串长度len<=ai 求一共有多少个符合题目要求的方案 求其中最长的一个串长度是 ...

  2. 766C - Mahmoud and a Message(dp)

    https://codeforces.com/problemset/problem/766/C 有一个长度为n的字符串,第二行有26个数字,位置1~26对应为a~z的字母,数值表示该字母不能出现在长度 ...

  3. codeforces 766 C Mahmoud and a Message

    题目链接:http://codeforces.com/contest/766/problem/C 题目: Mahmoud wrote a message s of length n. He wants ...

  4. 【CF 149D】Coloring Brackets(dp)

    [CF 149D]Coloring Brackets(dp) D. Coloring Brackets time limit per test 2 seconds memory limit per t ...

  5. 动态规划 —— 线性 DP —— 字符串编辑距离

    [概述] 字符串编辑距离,即 Levenshtein 距离,是俄国科学家 Vladimir Levenshtein 提出的概念,是指从一个字符串修改到另一个字符串时,编辑单个字符所需的最少次数,编辑单 ...

  6. POJ 2817 状态DP 字符串找最多的重复

    题意: 给出字符串个数 n 给出n串字符串 找出上下两个字符串重复和最多的个数.. eg: 5 abc bcd cde aaa bfcde 0根据 aaa abc bcd cde bfcde答案就是重 ...

  7. 8.6 edu25 ,577#div2 CF补题(二分 ,dp 与 贪心

    两道题 1.edu 25 D. Suitable Replacement 题意:给定字符串s,t,s中'?'字符可以以任何字符替换,问如何替换 可使 替换后的s重新排序与t的匹配次数最多(len_t& ...

  8. hdu 1159(DP+字符串最长公共序列)

    http://blog.csdn.net/a_eagle/article/details/7213236 公共序列可以用一个二维数组dp[i][j]保存每个点时的最大数字,本质就是一个双向比较. dp ...

  9. 蓝桥杯 算法训练 Cowboys By Assassin dp+字符串操作

    问题描述一个间不容发的时刻:n个牛仔站立于一个环中,并且每个牛仔都用左轮手枪指着他旁边的人!每个牛仔指着他顺时针或者逆时针方向上的相邻的人.正如很多西部片那样,在这一刻,绳命是入刺的不可惜--对峙的场 ...

  10. 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 ...

最新文章

  1. 吃瓜腾讯平均月薪7.27万后,微信又出大招
  2. mysql 终止 存储过程
  3. 深度学习(三十二)——AlphaGo, AlphaStar
  4. c语言最简单的程序编写,C语言简单程序编写.doc
  5. Java游戏用户登录注册_Java实现多用户注册登录的幸运抽奖
  6. python安装lzo_hadoop-lzo 安装配置
  7. HTML5 — 知识篇总结《II》【HTML5大力支持的语义化思想与规范】
  8. jenkins忘记密码和常用插件的下载
  9. 科技部正式发文:破除“唯论文”不良导向;网友:靠水论文拿奖励的人不开心了...
  10. android jni c调用java,Android JNI中C调用Java方法
  11. webpack 图片压缩
  12. namesilo续费
  13. 好玩的智力测试题-精品
  14. 项管行知02--工作环境
  15. 谷歌cloud_参加Google Cloud专业机器学习工程师考试的20天Beta
  16. Datawhale7月组队学习task1数据加载及探索性数据分析
  17. 模拟电路仿真LTspice(1):二极管特性曲线
  18. 【毕业设计】深度学习图像语义分割算法研究与实现 - python 机器视觉
  19. php如何读取文件,PHP如何读取文件内容?,懂得这些技巧就够了
  20. 修复win10的微软应用商店闪退

热门文章

  1. 进程的同步和互斥反映了_进程的同步和互斥
  2. python设置字符串的格式_Python中的字符串格式
  3. C++ const和static const的区别
  4. kubernetes视频教程笔记 (31)-安全-鉴权Authorization
  5. anaconda r 语言_Centos7系统下R、 Rstudio及sparklyr的安装与配置
  6. java 开关按钮_SwitchButton开关按钮的多种实现方式
  7. ubuntu设置始终亮屏_教你在Ubuntu系统下保存屏幕亮度设置
  8. modbus调试工具 linux,Modbus测试工具 :Modbus Poll,Modbus Slave
  9. Spring Boot 服务优雅关闭方式汇总, Spring Boot 打包排除指定文件
  10. Redis 常见问题 与 常见错误