传送门:点击打开链接
题意:长为n的只有数字组成的字符串(n<=5000),问能分割成多少组数字,这些数字里不含前导0,且数字的大小满足严格单调递增
思路:最难的地方,就是如何去快速判断两个数字的大小谁大谁小呢?
我们先来讲下最长公共前缀lcp的定义。如果有串A和串B,lcp[i][j]表示的是串A从原串第i位置开始,串B从原串第j位置开始,那么从这两个位置开始的有多少个字符相等
那么如何来求lcp呢,方程很简单,看了都能懂
lcp[i][j]=lcp[i+1][j+1]+1,if(s[i]==s[j])
lcp[i][j]=0,if(s[i]!=s[j])
求出lcp后如何快速判断两个区间的大数字是否相等呢?
假如lcp[a][b]>=len ,说明两个区间的数字是完全相等的,此时肯定数字是相等的
如果lcp[a][b]<len,那么我们只需要比较s[a+lcp[a][b]]和s[b+lcp[a][b]]的大小就可以了,因为这个位置是两个子串第一个不一样的位置.
知道了这个的话,我们就能再来考虑这道题的dp了。
设dp[i][j](j<=i)表示现在只考虑前i个,最后一个数字是以第j个开头。
那么就能得到转移方程
dp[i][j]+=dp[j-1][k], max(j+1-len,1)