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 ...
随机推荐
- js 二维数组定义
1.二维数组声明方式是下面这样的: var images=new Array(); //先声明一维 for(var i=0;i<10;i++){ //一维长度为10 images[i]=new ...
- Nginx出现413 Request Entity Too Large错误解决方法
Nginx出现的413 Request Entity Too Large错误,这个错误一般在上传文件的时候出现,打开nginx主配置文件nginx.conf,找到http{}段,添加 解决方法就是 打 ...
- JSP MVC
Java的MVC玩起来比.Net的有意思,因为每一步你都知道它是如何运作的,都由自己去实现.而在.Net的MVC中,你却不知道一个Controller是如何对应到View中的,因为MS给了你IDE上的 ...
- Spring实战4:面向切面编程
主要内容 面向切面编程的基本知识 为POJO创建切面 使用@AspectJ注解 为AspectJ的aspects注入依赖关系 在南方没有暖气的冬天,太冷了,非常想念北方有暖气的冬天.为了取暖,很多朋友 ...
- 【转】String.format详解
一.前言 String.format 作为文本处理工具,为我们提供强大而丰富的字符串格式化功能,为了不止步于简单调用 String.format("Hello %s", " ...
- android学习笔记一——简介
android 是由Andy Rubin创立的一个手机操作系统,后被google收购. google希望同各方共同建立一个标准化.开放式的移动电话软件平台,从而在移动产业内形成了一个开放式的操作平台. ...
- 一个android的各种控件库
在这里 https://github.com/Trinea/android-open-project 很多的listview,非常棒
- 调试压缩后的Javascript文件:在 Chrome 和 Safari ,选择“脚本”标签,找到相应的文件,然后点击“{}”图标(pretty print,在面板底部)
- Hadoop系统架构
一.Hadoop系统架构图 Hadoop1.0与hadoop2.0架构对比图 YARN架构: ResourceManager –处理客户端请求 –启动/监控ApplicationMaster –监控N ...
- memcache 内部原理实现
Lazy Expiration memcached 内部不会监视记录是否过期,而是在 get 时查看记录的时间戳,检查记录是否过期.这 种技术被称为 lazy(惰性)expiration.因此,mem ...