1002 Problem B
来源:互联网 发布:远距离网络对讲系统 编辑:程序博客网 时间:2024/05/18 00:26
1002 Problem B
题意:求出两个字符串的公共子序列长度最大值。
思路:最大公共子序列长度,关键是判断当前字符是否相等,如果相等,那么dp[i][j]=dp[i-1][j-1]+1;如果不相等,那么dp[i][j]=max(dp[i-1][j],dp[i][j-1]);(其中dp[i][j]为当前最大公共子序列的长度)
感想:不久前查了一下,关于最大子序列的问题,设有二维数组 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[i][j]中最大的数便是 X和 Y的最长公共子序列的长度,依据该数组回溯,便可找出最长公共子序列。
方法比较固定,判断问题的转折,然后套公式即可。
#include<iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
using namespace std;
char x[2000];
char y[2000];
int dp[2000][2000];
int main(){
intj,i,lenx,leny;
cin>>j;
while(scanf("%s%s",x,y)!= EOF){
memset(dp,0,sizeof(dp));
lenx=strlen(x); leny=strlen(y);
for(i=1;i<=lenx;i++)
for(j=1;j<=leny;j++){
if(x[i-1]==y[j-1]){
dp[i][j]=dp[i-1][j-1]+1;
}
else
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
cout<<dp[lenx][leny]<<endl;
}
return 0;
}
- 1002 Problem B
- 1002 Problem B
- 1002 Problem B
- 1002 Problem B
- 1002A+B Problem
- Problem-1002 : A + B Problem II
- 【HDOJ】 <Problem - 1002> : A + B Problem II
- Problem : 1002 ( A + B Problem II )
- Problem - 1002_A + B Problem II
- 1002 A + B Problem II
- 1002 A + B Problem II
- 1002 A + B Problem II
- 1002 ( A + B Problem II )
- 1002 A + B Problem II
- 1002:A + B Problem II
- hdu 1002 A+B problem ||
- hdu 1002 A+B Problem
- HDU 1002 A+B Problem
- MySQL存储过程+游标+触发器
- android 性能优化
- HDU NO.4162 Shape Number(最小表示法循环输出字符串)
- 2016 UESTC Training for Dynamic Programming B - 柱爷与最大区间和 最大区间和推广、前缀和、枚举间隔点
- gh0st的IOCP模型分析
- 1002 Problem B
- MySQL服务启动提示window无法启动MySQL服务 错误1067:进程意外终止
- No3.组合查询--机房收费
- JDBC 与 MyBatis
- BestCoder Round #83(HDU 5680)
- Ubuntu13.10系统 apt-get update失败解决办法
- Ubuntu下配置opencv-2.4.9
- CSS笔记(2)
- CTF加密解密 常见的加密方式