您的位置:首页 > 产品设计 > UI/UE

hdu 1159 Common Subsequence

2016-07-15 17:35 489 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1159



这个就是典型的动态规划题目,题目大概意思:  给你两个字符串, 然后让你计算这两个字符串公共部分的长度,以文件尾结尾;

mp[i][j] 表示第一个字符串前 i 个字母,第二个字符串前 j 个字母中公共的长度, 来源有三个: mp[i - 1][j - 1] + 1 、mp[i - 1][j] 、mp[i][j - 1] ,具体如下:

mp[i - 1][j - 1] + 1  : 只有相等时才加 1 ,并且相等的来源只有 i 、 j 的斜上方(在数组中);

mp[i - 1][j] 、mp[i][j - 1] : 这两个一个是 i 、 j  的正上方,一个是左侧, 取最大值;

 

代码:

#include<iostream>
#include<algorithm>
#include<queue>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cctype>
#include<cmath>
using namespace std;
const int N = 1009;
const int inf = 0x3f3f3f3f;
int mp

;//mp

数组用来存个数
char s1
, s2
;

int main()
{
while(~scanf(" %s %s", s1, s2))
{
int L1, L2, i, j;
L1 = strlen(s1);//计算长度
L2 = strlen(s2);

for(i = 0; i < L1; i++)
{
for(j = 0; j < L2; j++)
{
if(s1[i] == s2[j])
{
if((i - 1 < 0) || (j - 1 < 0)) //相等,并且上一步在数组外面
mp[i][j] = 1;
else
mp[i][j] = mp[i - 1][j - 1] + 1;
}
else
{
if((i - 1 < 0) && (j - 1 >= 0))
mp[i][j] = mp[i][j - 1];
else if((i - 1 >= 0) && (j - 1 < 0))
mp[i][j] = mp[i - 1][j];
else if((i - 1 < 0) && (j - 1 < 0)) // 类似于初始化
mp[i][j] = 0;
else
mp[i][j] = max(mp[i - 1][j], mp[i][j - 1]);
}

}
}
cout << mp[L1 - 1][L2 - 1] << endl;//输出答案即可
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: