LCS长度个数计算
来源:互联网 发布:塞内加 知乎 编辑:程序博客网 时间:2024/05/10 01:36
子串
给定一个字符串
对于任意一个集合
那么
如:
AABC
就是ABCABC
的一个子串
LCS
给定两个字符串
意思是:
求法
先给出代码:
#define mod 1000000007#define N 5010int n,m,f[N][N],h[N][N],ans;char s1[N],s2[N];int main(){ scanf("%s%s",s1+1,s2+1); n=strlen(s1+1); m=strlen(s2+1); fr(i,1,n) f[i][0]=1; fr(i,0,m) f[0][i]=1; fr(i,1,n) s1[i]-='a'-1; fr(i,1,m) s2[i]-='a'-1; fr(i,1,n) fr(j,1,m) if(s1[i]==s2[j]) { h[i][j]=h[i-1][j-1]+1; f[i][j]=f[i-1][j-1]; if(h[i-1][j]==h[i][j]) f[i][j]=(f[i][j]+f[i-1][j])%mod; if(h[i][j-1]==h[i][j]) f[i][j]=(f[i][j]+f[i][j-1])%mod; } else { h[i][j]=max(h[i-1][j],h[i][j-1]); if(h[i-1][j]==h[i][j]) f[i][j]=(f[i][j]+f[i-1][j])%mod; if(h[i][j-1]==h[i][j]) f[i][j]=(f[i][j]+f[i][j-1])%mod; if(h[i-1][j-1]==h[i][j]) f[i][j]=(f[i][j]-f[i-1][j-1]+mod)%mod; } printf("%d\n%d\n",h[n][m],f[n][m]); return 0;}
我们可以得出
我们先设一个函数
反正我是觉得没看代码直观。
至于这些怎么推出来的,应该是只有最后一条有疑问,反正减就是去重,可以参考NOIP2016Day2T1
阅读全文
1 0
- LCS长度个数计算
- Foundation_NSString_计算字符长度和个数
- UVA10405 LCS不同长度
- Java,php,python,js 计算字符串长度和数组个数
- 动态规划--LCS计算
- PHP:计算字符串中汉字的个数、正确计算字符串的长度
- 计算两个字符串间符合字典序且在一定长度内的字符串个数
- UVa 11488 Hyper Prefix Sets Trie树计算最大公共前缀长度*个数
- Python Tricks(五)—— 计算 list of lists 的长度(元素个数)
- 动态规划递归求解LCS长度
- 华为机试(字符串最后一个单词长度,计算字符串的个数,明明的随机数) Java实现
- 字符串长度 VS 字符个数
- 字符串长度与字节个数
- 长度限制计算长度与服务器计算长度不符
- 计算字符串的长度
- 计算字符串长度
- 数组长度计算
- java 计算字节长度
- Java出错集
- 三国志
- uva 10635 最长公共子序转最长上升子序
- Android彻底组件化demo发布
- 练习三 阶乘
- LCS长度个数计算
- linux正则
- mybatis和Spring的整合,逆向工程
- 1073. Scientific Notation (20)
- Java实现数组动态输入
- win8下使用VM12安装OS X10.12虚拟机
- Kubernetes API分类汇总
- java并发编程的基础
- 1084. Broken Keyboard (20)