题意:

把一个字符串分割成多个小串,小串组成严格递增序列,n<=5000

这是一个DP。

s代表原串

dp[i][j]代表当前到i位置最后一个串是以j为开头的方案数。答案就是dp[n][1]+...+dp[n][n]

很容易得到dp[i][j]=dp[j-1][k]+dp[j-1][k+1]……dp[j-1][j-1]    (i-j=j-k) 如果s[k-1....j-1] >=s[j....i], dp[i][j]+=dp[j-1][k-1]

这样dp的递推式就有了,很容易发现dp[i][j]的递推式是一个前缀和,假设我比较s[k-1....j-1]和s[j....i]是O(1) 那么就可以在n^2的复杂度里得到答案

所以问题转化为如何预处理以x为开头的串和以y为开头的串的大小(x<y)

令r[x][y]为以x开头的串和以y开头的串经过多少长度分出大小,is[x][y]为true代表x小,为false代表y小

if(r[x-1][y-1]>0) r[x][y]=r[x-1][y-1]-1,is[x][y]=is[x-1][y-1];

else 暴力跑出r[x][y]

所以对于每一个r[1][y]我们得出r[2][y+1]...r[n-y+1][n]的复杂度是O(n)

所以求出r[1][1]....r[1][n]

然后有了所有的is(x,y) 就可以O(1)比较以x和y开头的子串大小

具体代码

#include<iostream>
#include<cstring>
#include<cstdio>
#include<map>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=5005;
const long long MOD=1000000007;
long long dp[N][N];
int r[N][N];
bool is[N][N];
char s[N];
char a[N],b[N];
int l1,l2,n;
int main()
{int i,j,k;while(scanf("%d",&n)!=EOF){scanf("%s",s+1);for(i=1;i<=n;i++) dp[i][1]=1;for(j=2;j<=n;j++){is[1][j]=false;for(k=0;k+j<=n;k++){if(s[1+k]>s[j+k]) {is[1][j]=false;r[1][j]=k;break;}if(s[1+k]<s[j+k]) {is[1][j]=true;r[1][j]=k;break;}}if(k+j>n) r[1][j]=n+1;}for(k=1;k<n;k++){for(i=2;i+k<=n;i++){if(r[i-1][i+k-1]) {is[i][i+k]=is[i-1][i+k-1];r[i][i+k]=r[i-1][i+k-1]-1;}else{is[i][i+k]=false;for(j=0;i+j<=n&&i+k+j<=n;j++){if(s[i+j]>s[i+k+j]) {is[i][i+k]=false;r[i][i+k]=j;break;}if(s[i+j]<s[i+k+j]) {is[i][i+k]=true;r[i][i+k]=j;break;}}if(i+k+j>n) r[i][i+k]=n+1;}}}for(i=2;i<=n;i++){k=i;if(s[i]=='0') continue;long long sum=0;for(j=i;j<=n;j++){if(k>0) sum+=dp[i-1][k];if(sum>=MOD) sum%=MOD;k--;dp[j][i]+=sum;if(k>0&&s[k]=='0') continue;int flag=0;if(k>0){if(is[k][i]==true&&r[k][i]+k<i) flag=1;}if(flag) dp[j][i]+=dp[i-1][k];if(dp[j][i]>=MOD) dp[j][i]%=MOD;}}long long ans=0;for(i=1;i<=n;i++){ans+=dp[n][i];if(ans>=MOD) ans%=MOD;}cout<<ans<<endl;}return 0;
}

转载于:https://www.cnblogs.com/Woo95/p/5094637.html

Codeforces 611D New Year and Ancient Prophecy DP相关推荐

  1. Codeforces Good Bye 2015 D. New Year and Ancient Prophecy 后缀数组 树状数组 dp

    D. New Year and Ancient Prophecy 题目连接: http://www.codeforces.com/contest/611/problem/C Description L ...

  2. codeforces #274 C. Riding in a Lift dp+前缀和优化

    codeforces #274  C. Riding in a Lift   dp+前缀和优化 Imagine that you are in a building that has exactly  ...

  3. codeforces Round 21 808E. Selling Souvenirs 【dp好题】

    codeforces Round 21 808E. Selling Souvenirs [dp好题] E. Selling Souvenirs time limit per test 2 second ...

  4. 【CodeForces 611D】Ancient Prophesy

    智障模拟.. 我也是智障.. 下面傻逼代码没有过.. #include<bits/stdc++.h> using namespace std; #define maxn 100100 ch ...

  5. Codeforces Gym101246C:Explode 'Em All(DP + bitset)

    http://codeforces.com/gym/101246/problem/C 题意:给出一个n*m的图,"*"表示这个地方需要炸掉,炸弹可以如果丢在(i,j)位置的话,那么 ...

  6. Codeforces Gym 100676G Training Camp 状压dp

    http://codeforces.com/gym/100676 题目大意是告诉你要修n门课,每门课有一个权值w[i], 在第k天修该课程讲获得k*w[i]的学习点数,给出了课程与先修课程的关系,要修 ...

  7. Educational Codeforces Round 8 D. Magic Numbers 数位DP

    D. Magic Numbers 题目连接: http://www.codeforces.com/contest/628/problem/D Description Consider the deci ...

  8. Codeforces 1205C Palindromic Paths (交互题、DP)

    题目链接 http://codeforces.com/contest/1205/problem/C 题解 菜鸡永远做着变巨的梦 然而依然连div1BC题都不会做 要是那天去打cf怕是又要1题滚粗了.. ...

  9. CodeForces - 1557D Ezzat and Grid(线段树+dp)

    题目链接:点击查看 题目大意:给出 nnn 个 010101 串,现在问最少需要删掉多少个串,才能使得剩下的串拼起来是连通的 规定两个 010101 串是连通的,当且仅当存在至少一列,在两个串中都为 ...

最新文章

  1. 绩效面谈的细节,阿里巴巴是如何做的?
  2. 源码安装zabbix3.2.7时PHP ldap Warning
  3. PHP-开发环境搭建
  4. ubuntu12.04.5安装openssh-server所引发的血案
  5. opengl微开发之1-从零開始
  6. Atlantis Lite蓝色精品后台管理系统模板
  7. 用python实现bt下载_python实现bt种子 torrent转magnet
  8. AMD Catalyst 14.4 Linux带来完整的 OpenGL 4.4 支持
  9. ThreadLocal源码学习
  10. linux系统中jdk的卸载及安装
  11. html文件怎么用华为手机打开,如何调整华为手机中的文件默认打开方式
  12. 计算机并口地址定义,电脑并口(LPT)引脚定义
  13. python输入名字配对情侣网名_情侣名字配对网名可爱
  14. linux , Shell 文件合并的命令
  15. h5 禁止返回_Html5拦截Android返回键方法
  16. Civil 3d 之枚举 SpiralType
  17. 2021年计算机考研408操作系统真题(客观题)
  18. java webp文件转png,jpg
  19. 【C#】菜鸟教程学习笔记(二)
  20. 【mqtt】centos搭建EMQ mqtt服务器

热门文章

  1. html语言div什么意思,css中div是什么意思?
  2. android将拦截短信通过邮箱发送,网易邮箱Android客户端推出 加速布局移动互联网...
  3. sftp进入指定目录_CentOS7服务搭建----搭建SFTP(安全文件传送协议)服务器
  4. Java 输入流与输出流
  5. matlab 二次指数平滑法预测
  6. Windows系统——VMTK安装教程
  7. 【 FPGA 】按键消抖与LED灯流动小实验
  8. Cocos Creator 键盘监听事件
  9. 原子操作之sync/atomic
  10. php 之 数据访问 增删改查