/*
题意:给一个长度不超过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);
}

最新文章

  1. dubbo zk 分布式服务项目搭建与配置
  2. 洛谷 P1144 最短路计数 Label:水
  3. C#进程操作
  4. JqueryEasyUI浅谈---视频教程公布
  5. 表空间、Schema和用户
  6. 属性动画详解 Interpolator TypeEvaluator
  7. OC中的一个特性:延展
  8. Oracle EBS-SQL (SYS-12):查询各Profile的设置情况.sql
  9. Codeforces Gym 100269E Energy Tycoon 贪心
  10. 安卓和 java 学习笔记
  11. mysql目录迁移 更改mysql的存储目录
  12. java编译过程(字节码编译和即时编译)
  13. 在Linux中调试段错误(core dumped)
  14. (转)Docker磁盘垃圾清理
  15. 理解开发HD 钱包涉及的 BIP32、BIP44、BIP39
  16. Leetcode: Merge k Sorted List
  17. setInterval和setTimeout的区别以及setInterval越来越快问题的解决方法
  18. 菜鸟的HTML学习之路
  19. android:项目迁移error:Please change caller according to com.intellij.....
  20. Tomcat安装与优化

热门文章

  1. zookeeper源码学习一——zookeeper启动
  2. centos6.5 安装iptables
  3. mysql 远程访问授权
  4. 【java】 java 实现mysql备份
  5. [mysql] MariaDB 10.0.10 GTID复制
  6. HTML5显示地图例子
  7. bzoj3319: 黑白树
  8. TMS320C54x系列DSP的CPU与外设——第1章 绪论
  9. unity客户端与c++服务器之间的简单通讯_1
  10. Scala第二章学习笔记