Description

【题目描述】

给定一个长度为n的由['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 取模。

【输入数据】

第一行一个整数n,表示字符串长度;

第二行n个['0'..'9']内的字符,表示给出的字符串s。

【输出数据】

仅一行表示给出字符串s的上升序列个数对10^9+7取模的值。

【样例输入1】

6

123434

【样例输出1】

8

【样例输入2】

8

20152016

【样例输出2】

4

【数据范围】

对于30%的数据满足:n<=10;

对于100%的数据满足:n<=5000。

考虑DP

因为保证\(v[i][j]!=0\)

所以设\(dp[i][j]\)表示将以i为起始往后移动j个字符(i也算)为结束所产生的上升序列个数。

我们用后缀和,这样答案就是\(dp[1][1]\)。

用a数组记录从两个点开始最多重复多少个字符,以便于我们比较大小。

如果以i开始的字符串比以i+j开始的字符串小,符合题意,更新。

\(dp[i][j]+=dp[i+j][j]\)

如果以i开始的字符串大于等于以i+j开始的字符串,只能由这一位后面的全部字符更新。

$ dp[i][j]+=dp[i+j][j+1]$

综上。

#include<bits/stdc++.h>
#define mod 1000000007
using namespace std;
int a[5010][5010],dp[5010][5010],n;
char ch[5010];
bool check(int x,int y)
{
int l=min(y-x-1,a[x][y]);
return ch[x+l]<ch[y+l];
}
int main()
{
scanf("%d%s",&n,ch+1);
for(int i=n;i;i--)
{
for(int j=i+1;j<=n;j++)
{
if(ch[i]==ch[j])
{
a[i][j]=a[i+1][j+1]+1;
}
}
}
for(int i=n;i;i--)
{
if(ch[i]=='0')
{
continue;
}
dp[i][n-i+1]=1;
for(int j=1;j<=n-i;j++)
{
if(check(i,i+j))
{
dp[i][j]=(dp[i][j]+dp[i+j][j])%mod;
}else{
dp[i][j]=(dp[i][j]+dp[i+j][j+1])%mod;
}
}
for(int j=n-i;j;j--)
{
dp[i][j]=(dp[i][j]+dp[i][j+1])%mod;
}
}
printf("%d\n",dp[1][1]%mod);
return 0;
}

【XSY2564】sequence的更多相关文章

  1. 【dfs】Sequence Decoding

    Sequence Decoding 题目描述 The amino acids in proteins are classified into two types of elements, hydrop ...

  2. 【BZOJ-1367】sequence 可并堆+中位数

    1367: [Baltic2004]sequence Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 932  Solved: 348[Submit][S ...

  3. BZOJ1367【Baltic2004】sequence

    题面 Description Input Output 一个整数R Sample Input 7 9 4 8 20 14 15 18 Sample Output 13 Hint 所求的Z序列为6,7, ...

  4. 【BZOJ1367】【Baltic2004】sequence - 可合并堆

    题意: 题解: 其实这是道水题啦……只不过我没做过而已 先考虑构造不严格递增序列,考虑原序列中的一段下降区间,显然区间中的$z$全取中位数最优: 那么可以把原序列拆成很多个下降序列,从头到尾加入原序列 ...

  5. 【XSY2985】【BZOJ1367】【Baltic2004】sequence

    考虑两种情况: 1.\(a_1\)<\(a_2\)<\(a_3\)<\(a_4\)...<\(a_n\) 直接令\(b_i\)=\(a_i\),最小. 2.\(a_1\)> ...

  6. 【测试题】sequence

    题目 给定一个长度为n(n<=5000)的由['0'..'9']组成的字符串s,v[i,j]表示由字符串s第i到第j位组成的十进制数字. 将它的某一个上升序列定义为:将这个字符串切割成m段不含前 ...

  7. 【LeetCode】图论 graph(共20题)

    [133]Clone Graph (2019年3月9日,复习) 给定一个图,返回它的深拷贝. 题解:dfs 或者 bfs 都可以 /* // Definition for a Node. class ...

  8. 【LeetCode】拓扑排序 topological-sort(共5题)

    [207]Course Schedule [210]Course Schedule II [269]Alien Dictionary [329]Longest Increasing Path in a ...

  9. 【LeetCode】拓扑排序

    [207] Course Schedule 排课问题,n门课排课,有的课程必须在另外一些课程之前上,问能不能排出来顺序. 题解:裸的拓扑排序.参考代码见算法竞赛入门指南这本书. class Solut ...

随机推荐

  1. Scala 学习笔记之函数(1)

    class Student { val mySayHello1: String => Unit = sayHello val mySayHello2: (String, Int) => U ...

  2. 1. SOFAJRaft源码分析— SOFAJRaft启动时做了什么?

    我们这次依然用上次的例子CounterServer来进行讲解: 我这里就不贴整个代码了 public static void main(final String[] args) throws IOEx ...

  3. 高清屏下canvas重置尺寸引发的问题

    我们知道,清空canvas画布内容有以下两个方法. 第一种方法是cearRect函数: context.cearRect(0,0,canvas.width,canvas.height) 第二种方法就是 ...

  4. mobaxterm和CRT的文件上传

    版权声明:本文为博主原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/submarineas/article/de ...

  5. .net Core 发布服务

    .net core 发布服务 准备好的文件可以通过下面的几个命令进行操作 1.创建Service sc create "服务名" binPath= "文件路径+文件名&q ...

  6. java并发之CAS详解

    前言 在高并发的应用当中,最关键的问题就是对共享变量的安全访问,通常我们都是通过加锁的方式,比如说synchronized.Lock来保证原子性,或者在某些应用当中,用voliate来保证变量的可见性 ...

  7. nextjs:如何将静态资源发布到 CDN

    nextjs 是基于 react 的服务端同构指出框架,在使用的过程中也多多少少遇到过几个问题,其中最大的问题就是静态资源的发布了. 1. 如何基于文件内容进行 hash 命名 Next.js use ...

  8. golang初探与命令源码分析

    前段时间有群友在群里问一个go语言的问题: 就是有一个main.go的main函数里调用了另一个demo.go里的hello()函数.其中main.go和hello.go同属于main包.但是在mai ...

  9. 马蜂窝 IM 移动端架构的从 0 到 1

    (马蜂窝技术原创内容,公众号 ID:mfwtech) 移动互联网技术改变了旅游的世界,这个领域过去沉重的信息分销成本被大大降低.用户与服务供应商之间.用户与用户之间的沟通路径逐渐打通,沟通的场景也在不 ...

  10. Java编程思想——第17章 容器深入研究 读书笔记(二)

    五.List的功能方法 排除Collection已包含的方法外还增加了 boolean addAll(int index, Collection<? extends E> c);从索引位置 ...