poj1458解题报告
2010-11-14 18:47
393 查看
最长公共子序列问题
百度找的动态规划算法如下:
以两个序列 X、Y 为例子:
设有二维数组 f[i,j] 表示 X 的 i 位和 Y 的 j 位之前的最长公共子序列的长度,则有:
f[1][1] = same(1,1);
f[i,j] = max{f[i-1][j ? 1] + same(i,j),f[i-1,j],f[i,j?1]}
其中,same(a,b)当 X 的第 a 位与 Y 的第 b 位完全相同时为“1”,否则为“0”。
此时,f[j]中最大的数便是 X 和 Y 的最长公共子序列的长度,依据该数组回溯,便可找出最长公共子序列。
该算法的空间、时间复杂度均为O(n^2。
百度找的动态规划算法如下:
以两个序列 X、Y 为例子:
设有二维数组 f[i,j] 表示 X 的 i 位和 Y 的 j 位之前的最长公共子序列的长度,则有:
f[1][1] = same(1,1);
f[i,j] = max{f[i-1][j ? 1] + same(i,j),f[i-1,j],f[i,j?1]}
其中,same(a,b)当 X 的第 a 位与 Y 的第 b 位完全相同时为“1”,否则为“0”。
此时,f[j]中最大的数便是 X 和 Y 的最长公共子序列的长度,依据该数组回溯,便可找出最长公共子序列。
该算法的空间、时间复杂度均为O(n^2。
#include<iostream> using namespace std; int dp[300][300]; char a[300],b[300]; int maxx(int a,int b) { if(a>b) return a; return b; } int main() { int i,j; while(cin>>a>>b) { memset(dp,0,sizeof(dp)); for(i=1;i<=strlen(a);i++) for(j=1;j<=strlen(b);j++) { if(a[i-1]==b[j-1]) { dp[i][j]=dp[i-1][j-1]+1; } else dp[i][j]=maxx(dp[i][j-1],dp[i-1][j]); } cout<<dp[strlen(a)][strlen(b)]<<endl; } return 0; }
相关文章推荐
- POJ 1458 解题报告
- POJ 1458解题报告
- poj解题报告——1458
- POJ 1458(最长公共子序列 动态规划) 解题报告
- POJ 1458(最长公共子序列 动态规划) 解题报告
- poj1458解题报告
- 2018.1.30【 POJ - 1458 】解题报告(dp,最长相同子序列)
- POJ 2187 旋转卡壳 解题报告
- POJ - 3083 Children of the Candy Corn 解题报告
- poj解题报告——2676
- POJ 2545 解题报告
- poj 1046 Color Me Less 解题报告
- POJ2112解题报告【网络流-初级-isap+floyd_warshall+二分】
- poj1063 解题报告(poj 1063 analysis report)
- poj解题报告——3273
- [解题报告]POJ_2503 字典树,MAP
- POJ2236 解题报告
- poj解题报告——2068
- POJ1703 解题报告
- poj解题报告——2586