题目

给定一个长度为n(n<=5000)的由['0'..'9']组成的字符串s,v[i,j]表示由字符串s第i到第j位组成的十进制数字。

将它的某一个上升序列定义为:将这个字符串切割成m段不含前导'0'的串,切点分别为k1,k2...km-1,使得v[1,k1]<v[k1+1,k2]<...<v[km-2,km-1]。

请你求出该字符串s的上升序列个数,答案对 10^9+7 取模。

题解

对于这种dp题,如果没有思路,我们可以先从最暴力的搜索开始分析,然后逐步优化

版本1

深搜枚举每一段的起点,搜完后逐段验证。

版本2

发现只要记录当前起点,终点,就可以描述出所有的后续状态,从而实现记忆化搜索。

版本3

把深搜改造成从后往前的dp,开两维记录起点、终点。时间复杂度:$O(n^3)$

版本4

把匹配过程改进,通过dp预处理出所有串的lcp,将匹配过程跳至不相等处。时间复杂度:$O(n^2)$

总结

设发$f[i][j]$表示起点为i,区间长度为j的方案数

那么本段范围为$[i,i+j)$,下一段的终点$>=i+j*2-1$

考虑状态转移:

若当前段比下一段小,则

$f[i][j] = f[i+j][j] + f[i+j][j+1] + ... + f[i+j][n-i]$

否则

$f[i][j] = f[i+j][j+1] + f[i+j][j+2] + ... + f[i+j][n-i]$

但是如果这样枚举会变成$O(n^3)$

我们可以使用后缀和来加速过程。

代码

#include <iostream>
#include <cstdio>
#define N 5001
#define int long long
#define mod (int)1e9+7
using namespace std;
char str[N];
int dp[N][N],n,lcp[N][N];
int compare(int a,int b)
{
int t=min(lcp[a][b],b-a-1);
return str[a+t]<str[b+t];
}
signed main()
{
cin>>n;
scanf("%s",str+1);
for(int i=n;i;i--)//lcp[i][j]表示从str[i,n]和str[j,n]的lcp
{
for(int j=i+1;j<=n;j++)
{
if(str[i]==str[j]) lcp[i][j]=lcp[i+1][j+1]+1;
}
}
for(int i=n;i;i--)//枚举起点
{
if(str[i]=='0') continue;
dp[i][n-i+1]=1;//起点到n划为一块
for(int j=1;j<=n-i;j++)//枚举区间长度,同时也是下一个起点的位置
{
if(compare(i,i+j)) dp[i][j]=dp[i+j][j];//等同于公式1
else dp[i][j]=dp[i+j][j+1];//等同于公式2
}
for(int j=n-i;j;j--)//维护后缀和
{
//cout<<dp[i][j]<<" ";
dp[i][j]+=dp[i][j+1],dp[i][j]%=mod;
}
//cout<<endl;
}
cout<<dp[1][1];
}

  

  

 

【测试题】sequence的更多相关文章

  1. oracle SEQUENCE 创建, 修改,删除

    oracle创建序列化: CREATE SEQUENCE seq_itv_collection            INCREMENT BY 1  -- 每次加几个              STA ...

  2. Oracle数据库自动备份SQL文本:Procedure存储过程,View视图,Function函数,Trigger触发器,Sequence序列号等

    功能:备份存储过程,视图,函数触发器,Sequence序列号等准备工作:--1.创建文件夹 :'E:/OracleBackUp/ProcBack';--文本存放的路径--2.执行:create or ...

  3. DG gap sequence修复一例

    环境:Oracle 11.2.0.4 DG 故障现象: 客户在备库告警日志中发现GAP sequence提示信息: Mon Nov 21 09:53:29 2016 Media Recovery Wa ...

  4. Permutation Sequence

    The set [1,2,3,-,n] contains a total of n! unique permutations. By listing and labeling all of the p ...

  5. [LeetCode] Sequence Reconstruction 序列重建

    Check whether the original sequence org can be uniquely reconstructed from the sequences in seqs. Th ...

  6. [LeetCode] Binary Tree Longest Consecutive Sequence 二叉树最长连续序列

    Given a binary tree, find the length of the longest consecutive sequence path. The path refers to an ...

  7. [LeetCode] Verify Preorder Sequence in Binary Search Tree 验证二叉搜索树的先序序列

    Given an array of numbers, verify whether it is the correct preorder traversal sequence of a binary ...

  8. [LeetCode] Longest Consecutive Sequence 求最长连续序列

    Given an unsorted array of integers, find the length of the longest consecutive elements sequence. F ...

  9. [LeetCode] Permutation Sequence 序列排序

    The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and labeling all of the p ...

随机推荐

  1. golang知识精要(二)

    类型 go是**静态类型**语言,不能在运行期改变变量类型. 变量定义 使用var定义变量,自动初始化为零值: 如果提供初始值,可省略变量类型: 函数内部可使用:=定义变量. var x int // ...

  2. Win10 UEFI 系统安装教程

    1:首先我们需要先拿一个U盘,制作一个带UEFI PE.(网上的大白菜以及老毛桃都可以,我用的是从网上找的WIN10 PE.WIN10 PE的好处是集成了NVME驱动,可以认得到SM951 NVME版 ...

  3. K8S学习笔记之K8S日志搜集实战

    详细参考这篇文章,几乎覆盖了了K8S的各种日志搜集方案 https://juejin.im/post/5b6eaef96fb9a04fa25a0d37#heading-8

  4. quota磁盘配额

    一.什么是磁盘配额 磁盘配额从字面意思上看就是给一个磁盘配置多少额度,而quota就是有多少限额的意思,所以总的来说就是限制用户对磁盘空间的使用量.因为Linux是多用户多任务的操作系统,许多人公用磁 ...

  5. iOS - 架构的认识过程,悬崖勒马。

    16年的时候写过一篇代码讲解的,依旧是这三种架构,现在20年将近了,看到好的文章,是否增加新的认识. 16年链接 iOS - 架构模式 - 解密 MVC.MVP.MVVM.VIPER架构 新项目选择架 ...

  6. VB参考

    Open 语句: 能够对文件输入/输出 (I/O). Open pathname For mode [Access access] [lock] As [#]filenumber [Len=recle ...

  7. Active Directory渗透测试典型案例

    0x01 前言 我有几个客户在渗透测试之前来找我,说他们的系统安全做得非常好,因为他们的漏洞扫描显示没有严重的漏洞并且已准备好进行安全测试,这使我在15分钟内利用AD中的错误配置获得了域管理员权限. ...

  8. springboot如何读取配置文件中的参数(例如:application-consts.properties) 又结合maven读取配置文件的顺序

    1.启动项目后,会读取pom.xml中的配置文件,例如现在读取的是本地配置 2.找到对应的配置文件  会读取uri地址下的配置.注:如果为springboot启动无需加config项目的名称,应该本身 ...

  9. PB调用C#编写的Dll类库

    在c# 中编写com组件,供PB调用实例 前言:c#中写的dll直接是不能被pb调用的,只有写成com组件才可以调用,所以用c#写dll时要注意. c#中新建类库 类库类型为通用类库,项目名为AddC ...

  10. Linux more与less命令

    1.命令简介 more (more) 该命令一次显示一屏文本,满屏后停下来,并且在屏幕的底部出现一个提示信息,给出至今己显示的该文件的百分比,方便逐页阅读(file perusal filter fo ...