POJ 1458 Common Subsequence (DP,LCS)
2013-11-13 18:19
429 查看
基础LCS,就是求LCS,用dp来解
简单说一下LCS:
设两个字符串s1,s2,对于中间任意两个字符s1[i]跟s2[j],有两种可能
1,s1[i] == s2[j],那么s1[i]必然是s1[1.....i]跟s2[1......j]的最长公共子串的最后一位,也就是s1[1......i-1]跟s2[1.....j-1]最长公共子串长度+1,理由是如果不是,那么s1[1.....i]跟s2[1......j]的LCS长度为s1[1......i-1]跟s2[1.....j-1]的LCS长度,明显小于上面那个值
2.s1[i] !=s2[j],此时s1[1.....i]跟s2[1......j]的LCS的值必然是MAX{s1[1......i-1]跟s2[1.....j]的LCS,s1[1......i]跟s2[1.....j-1]的LCS},也就是舍弃一边不匹配情况的最大值。
基于上式就可以写状态转移方程了
if( s1[i] == s2[j]):
dp[i][j]=dp[i-1][j-1]+1
else:
dp[i][j]=MAX(dp[i][j-1],dp[i-1][j])
最后贴一下代码,个人觉得还挺简介的
简单说一下LCS:
设两个字符串s1,s2,对于中间任意两个字符s1[i]跟s2[j],有两种可能
1,s1[i] == s2[j],那么s1[i]必然是s1[1.....i]跟s2[1......j]的最长公共子串的最后一位,也就是s1[1......i-1]跟s2[1.....j-1]最长公共子串长度+1,理由是如果不是,那么s1[1.....i]跟s2[1......j]的LCS长度为s1[1......i-1]跟s2[1.....j-1]的LCS长度,明显小于上面那个值
2.s1[i] !=s2[j],此时s1[1.....i]跟s2[1......j]的LCS的值必然是MAX{s1[1......i-1]跟s2[1.....j]的LCS,s1[1......i]跟s2[1.....j-1]的LCS},也就是舍弃一边不匹配情况的最大值。
基于上式就可以写状态转移方程了
if( s1[i] == s2[j]):
dp[i][j]=dp[i-1][j-1]+1
else:
dp[i][j]=MAX(dp[i][j-1],dp[i-1][j])
最后贴一下代码,个人觉得还挺简介的
#include <stdio.h> #define MAX 240 #define max(a,b) ((a)>(b)?(a):(b)) int main() { char a[MAX],b[MAX]; int dp[MAX][MAX]; int i=0,j=0; while(scanf("%s %s",a,b)!=EOF) { for(i=1;0 != a[i-1];++i) { for(j=1;0 != b[j-1];++j) { dp[i][j]=a[i-1] == b[j-1]? dp[i-1][j-1]+1:max(dp[i-1][j],dp[i][j-1]); } } printf("%d\n",dp[i-1][j-1]); } }
相关文章推荐
- Mysql-Truncated incorrect time value: '1000:59:44'
- POJ 2442 Sequence (堆)
- error C1189:#error:This file requires _WIN32_WINNT to be #defined at least to 0x0403
- Ant build.xml中的各种变量
- 解决iOS7上自定义导航条UIBarButtonItem偏移问题
- ADO.NET中ExcuteNonQuery获取存储过程Return返回值
- UIButton使用详解
- 有一个无效 SelectedValue,因为它不在项目列表中
- 代码创建UISearchDisplayCountroller
- 物理DG主备库切换时遇到ORA-16139: media recovery required错误
- @RequestParam 传值 中文乱码
- 利用handler.post()更新UI
- UITableView 保存选中状态的方式
- LABjs、RequireJS、SeaJS 哪个最好用?为什么?
- loaded the "BlueView" nib but the view outlet was not set 错误的解决办法。
- 关于request.getHeader("Referer")的说明
- Guid
- Android UI系列-----时间、日期、Toasts和进度条Dialog
- 如何使用开源的WebUI自动化框架Dagger?
- 编制一个返回值为bool型的函数isPrimer(),用于判断参数是否为素数(是素数返回true,否则false),自编main函数用于测试