Codeforces 611d [DP][字符串]
/*
题意:给一个长度不超过5000的字符串,每个字符都是0到9的数字。
要求将整个字符串划分成严格递增的几个数字,并且不允许前导零。
思路:
1.很开心得发现,当我在前i个区间以后再加一个区间的时候,转移
的条件只跟最后一个区间的数字大小有关,这决定这道题可以dp...
2.dp[i][j]代表前j个字符,最后划分的区间的第一个字符是第i个的答案数。
3.可知对于所有的dp[i][i...n]他们的答案都取决与dp[1...i-1][i-1].
4.很容易想到对于同一个i,累加求得dp[i][k]的值,但是如何判断
数字大小呢...首先长度不同的情况下直接根据长度判断即可(因为不允许
前导零)。长度相同的情况下,需要比较这两个字符串哪个大。这个时候
预处理出 ook[i][j]代表以第i个位置和第j个位置为开头的两个字符串他嗯
第一个不相同的字符的位置。 */ // 2016/9/6 13:07
#include<bits/stdc++.h>
#define N 5005
using namespace std;
int ook[][];
long long dp[N][N];
long long mod=1e9+;
char jilu[N];
int main()
{
int n;
scanf("%d%s",&n,jilu+);
memset(ook,0x3f,sizeof(ook));
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
if(jilu[i]!=jilu[j]){
int k=;
while(i-k>&&j-k>&&ook[i-k][j-k]>k){
ook[i-k][j-k]=k;
k++;
}
}
}
}
for(int i=;i<=n;i++){
if(jilu[i]=='')continue;
long long sum=;
int a=i-,b=i;
while(b<=n){
if(i==){
dp[i][b]=;
}
else{
while(a>&&i-a<b-i+){
sum+=dp[a][i-];
sum%=mod;
a--;
}
if(a>&&ook[a][i]<=b-i&&jilu[a+ook[a][i]]<jilu[i+ook[a][i]]){
sum+=dp[a][i-];
sum%=mod;
a--;
}
dp[i][b]=sum;
}
b++;
}
}
long long ans=;
for(int i=;i<=n;i++){
ans+=dp[i][n];
ans%=mod;
}
printf("%lld\n",ans);
}
Codeforces 611d [DP][字符串]的更多相关文章
- Codeforces 611D New Year and Ancient Prophecy dp+字符串比较
这是CF Goodbye 2015 的D题,当时我想了一个n^3的dp算法,肯定不能过,然后听到学长后缀数组的n^2log(n)写法,仰慕 最后打完比赛看到了t神的n^2写法,简直膜拜,直接省去了后缀 ...
- Codeforces 176B (线性DP+字符串)
题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=28214 题目大意:源串有如下变形:每次将串切为两半,位置颠倒形成 ...
- Codeforces Round #367 (Div. 2) A B C 暴力 二分 dp(字符串的反转)
A. Beru-taxi time limit per test 1 second memory limit per test 256 megabytes input standard input o ...
- Codeforces 1150D(字符串dp)
反思 三维的dp压根没看出来,看题解以后思路又很直观,找几道字符串dp练练才行 序列自动机和优化一维略 /* __ __ * ____| |_____| |____ * | | * | __ | * ...
- Codeforces 1303E. Erase Subsequences 代码(dp 字符串压缩一维状态优化)
https://codeforces.com/contest/1303/problem/E #include<bits/stdc++.h> using namespace std; ; i ...
- CodeForces - 706C Hard problem(dp+字符串)
题意:有n个字符串,只能将其逆转,不能交换位置,且已知逆转某字符串需要消耗的能量,问将这n个字符串按字典序从小到大排序所需消耗的最少能量. 分析:每个字符串要么逆转,要么不逆转,相邻两个字符串进行比较 ...
- codeforces的dp专题
1.(467C)http://codeforces.com/problemset/problem/467/C 题意:有一个长为n的序列,选取k个长度为m的子序列(子序列中不能有位置重复),求所取的k个 ...
- CodeForces 607C (DP) Hard problem
题目:这里 题意:给定n个字符串,每个字符串可以进行一项操作,就是将这个字符串交换,就是该字符串的第一个和最后一个交换,第二个和倒数第二个交换,以此类推,当然可以选择对于 该字符串进行或不进行这项操作 ...
- HDU 2089 数位dp/字符串处理 两种方法
不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
随机推荐
- 转(linux shell)
请把如下字符串 stu494 e222f stu495 bedf3 stu496 92236 stu497 49b91 转为如下形式: stu494=e222f stu495=bedf3 stu496 ...
- python数据分析之pandas库的Series应用
一.pandas的数据结构介绍 1. Series 1.1 Series是由一种类似于一维数组的对象,它由一组数据以及一组与之相关的数据索引构成.仅由一组数据可产生最简单的Series. from p ...
- Android内核剖析读书笔记
第16章 程序包管理 PackageManagerService類 PmS 目錄 16.1 包管理概述 16.2 packages.xml文件格式 16.3 包管理服務的啟動過程 16.4 應用程序的 ...
- Ext JS treegrid 发生的在tree上增加itemclick 与在其它列上增加actioncolumn 发生事件冲突(event conflict)的解决办法
Ext JS treegrid 发生的在tree上增加itemclick 与在其它列上增加actioncolumn 发生事件冲突(event conflict)的解决办法 最近在适用Ext JS4开发 ...
- [转]开源那些事儿(四)-如何使用CodePlex进行项目管理
本文版权信息作者:Jake Lin(Jake's Blog on 博客园) 出处:http://www.cnblogs.com/procoder/archive/2010/02/10/About-Op ...
- jQ的toggle()方法示例
定义和用法toggle() 方法切换元素的可见状态.如果被选元素可见,则隐藏这些元素,如果被选元素隐藏,则显示这些元素. 语法$(selector).toggle(speed,callback,swi ...
- IntelliJ IDEA手动配置连接MySQL数据库
先从菜单View→Tool Windows→Database打开数据库工具窗口,如下图所示: 点击Database工具窗口左上角添加按钮"+",选择数据库类型,这里以MySQL为例 ...
- python使用random函数生成随机数
python使用random函数来生成随机数,常用的方法有: import random #生成0-1之间的数(不包括0和1) random.random() #生成1-5之间的随机整数(包括1和5) ...
- .NET常用方法——邮件发送
邮件发送类文件,可直接使用: 调用方法(实例化.静态调用): 实例化: string exception = ""; SendEmail.SendEmail SE = new Se ...
- JS URL 使用base64加密与解密
JS编码方式: <script type="text/javascript"> document.write(encodeURI("http://www.w3 ...