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;
}
这个就是典型的动态规划题目,题目大概意思: 给你两个字符串, 然后让你计算这两个字符串公共部分的长度,以文件尾结尾;
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;
}
相关文章推荐
- View requires API level 14 (current min is 8): <GridLayout>
- discuz X3.2 开启QQ互联后,点击登录以后报错:(1054) Unknown column 'conuintoken' in 'field list'
- Cf Round #361 (Div. 2) 689D. Friends and Subsequences
- UITableViewCell 中的单选控制 UITableViewCellAccessoryCheckmark
- org.openqa.selenium.remote.SessionNotFoundException: The FirefoxDriver cannot be used after quit() was called.
- Android进阶UI之使用TextInputLayout创建一个登陆界面
- UESTC149 解救小Q
- Druid 数据库用户密码加密 代码实现
- UI面板拖放
- UITableViewController类预置模板详解(部分一)
- HDU 1005 Number Sequence[数论]
- NSString之 doubleValue floatValue intValue integerValue longLongValue
- arm交叉编译器gnueabi、none-eabi、arm-eabi、gnueabihf、gnueabi区别
- UITextField 输入限制
- ubuntu bluetooth 配对过程
- easyUI 消息框的API
- POJ 3080 Blue Jeans
- UIView初始化
- 服务器端判断request是Ajax请求(异步)还是传统请求(同步)
- codeforces 691E Xor-sequences 矩阵快速幂