【测试题】sequence
题目
给定一个长度为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的更多相关文章
- oracle SEQUENCE 创建, 修改,删除
oracle创建序列化: CREATE SEQUENCE seq_itv_collection INCREMENT BY 1 -- 每次加几个 STA ...
- Oracle数据库自动备份SQL文本:Procedure存储过程,View视图,Function函数,Trigger触发器,Sequence序列号等
功能:备份存储过程,视图,函数触发器,Sequence序列号等准备工作:--1.创建文件夹 :'E:/OracleBackUp/ProcBack';--文本存放的路径--2.执行:create or ...
- DG gap sequence修复一例
环境:Oracle 11.2.0.4 DG 故障现象: 客户在备库告警日志中发现GAP sequence提示信息: Mon Nov 21 09:53:29 2016 Media Recovery Wa ...
- Permutation Sequence
The set [1,2,3,-,n] contains a total of n! unique permutations. By listing and labeling all of the p ...
- [LeetCode] Sequence Reconstruction 序列重建
Check whether the original sequence org can be uniquely reconstructed from the sequences in seqs. Th ...
- [LeetCode] Binary Tree Longest Consecutive Sequence 二叉树最长连续序列
Given a binary tree, find the length of the longest consecutive sequence path. The path refers to an ...
- [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 ...
- [LeetCode] Longest Consecutive Sequence 求最长连续序列
Given an unsorted array of integers, find the length of the longest consecutive elements sequence. F ...
- [LeetCode] Permutation Sequence 序列排序
The set [1,2,3,…,n] contains a total of n! unique permutations. By listing and labeling all of the p ...
随机推荐
- 动态代理(二)—— CGLIB代理原理
前篇文章动态代理(一)--JDK中的动态代理中详细介绍了JDK动态代理的Demo实现,api介绍,原理详解.这篇文章继续讨论Java中的动态代理,并提及了Java中动态代理的几种实现方式.这里继续介绍 ...
- Windwos利用批处理文件自动清理归档日志,计划任务
首先在X盘根目录建立一个文档 cmd.txt 打开cmd.txt这个文本文件,在里面第一行写入 DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-3'; ...
- C#表达式参数解析算法,N级属性调用,函数值,变量值,常量值
public static object GetValue(Expression expression) { var names = new Stack<string>(); var ex ...
- 安装和使用pyltp
什么是pyltp: pyltp 是LTP的 Python 封装,提供了分词,词性标注,命名实体识别,依存句法分析,语义角色标注的功能. 安装 pyltp 测试环境:系统win10 64位, pytho ...
- 【Mysql技术内幕InnoDB存储引擎】读书笔记
一.存储引擎 1.InnoDB引擎 设计目标是面向在线事务(OLTP)处理的应用. 支持事务.行级锁.通过多版本并发控制(MVCC)支持高并发.提供一致性非锁定读.next-key locking避免 ...
- SqlServer共用表达式(CTE)With As 处理递归查询
共用表表达式(CTE)可以看成是一个临时的结果集,可以再SELECT,INSERT,UPDATE,DELETE,MARGE语句中多次引用. 一好处:使用共用表表达式可以让语句更加清晰简练. 1.可以定 ...
- HTNL5-ARIA role属性
WAI-ARIA Web Accessibility Initiative’s Accessible Rich Internet Applications 无障碍网页倡议–无障碍的富互联网应用,也简称 ...
- JavaScript 数组(一)数组基础
一.数组 1.概述 数组 就是将多个元素按一定顺序排放到一个集合中,那么这个集合称之为数组. 数组 也是一种数据类型,属于复杂数据类型(Object). 2.特点 存放的元素有序的. 可以存放不同的数 ...
- 解决bootstrap模态框居中问题
完美解决办法: 在bootstrap.js或bootstrap.min.js文件中找到Modal.prototype.show方法. 在that.$element.addClass('in').att ...
- sql 使用条件
group by 1.在属性中出现相同内容的时候可以使用 2.也可以用来排序desc asc 批量插入数据 INSERT into 表(属性)(select *from 表) INSERT int ...