hdu1159Common Subsequence(DP最长公共递增序列)
2013-09-10 21:14
232 查看
题目:给定序列的一个子序列是给定的序列冷落的一些元素(可能没有)。鉴于序列X = <x1, x2, ..., xm>另一个序列Z = <z1, z2, ..., zk>的X是一个序列,如果存在一个严格递增序列<I1,I2,.. IK> X使得指数所有的j = 1,2,...,K,XIJ = ZJ。例如,Z = <A, B, f, C>是一个子序列X = <A, B, c, f, B, C>索引序列<1,2,4,6>。给定两个序列X和Y的问题是要找到的最大长度的X和Y的公共子序列
的程序的输入是从一个文本文件的长度。文件中的每个数据集包含两个字符串,表示给定的序列。序列分隔的任意数量的空格。输入的数据是正确的。对于每一组数据的程序从一开始一个单独的线的最大长度的公共子序列的长度在标准输出上打印。
题解:题目就是要求最长的非连续递增公共序列,可以用DP求解;
原题:http://acm.hdu.edu.cn/showproblem.php?pid=1159
状态转移函数:dp[i][j]=max{dp[i-1][j],dp[i][j-1]},若a[i-1]==b[j-1],则dp[i][j]=max{dp[i][j],dp[i-1][j-1]+1};
举例说明:abcfbc 与abfcab
a b c f b c
a 1 1 1 1 1 1
b 1 2 2 2 2 2
f 1 2 2 3 3 3
c 1 2 3 3 3 3
a 1 2 3 3 3 4
b 1 2 3 4 4 4
代码实现:
#include<stdio.h>
#include<iostream>
#include<cstring>
using namespace std;
#pragma comment(linker,"/STACK:102400000,102400000")
#define MAX 10001
int dp[MAX][MAX];
char a[MAX],b[MAX];
int max(int x,int y)
{
return(x>y?x:y);
}
int main()
{
//freopen("input.txt","r",stdin);
while(cin>>a>>b)
{
int lena=strlen(a);
int lenb=strlen(b);
memset(dp,0,sizeof(dp));
for(int i=1;i<=lena;i++)
{
for(int j=1;j<=lenb;j++)
{
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
if(a[i-1]==b[j-1])//对应字符相同,则dp[i-1][j-1]+1
dp[i][j]=max(dp[i][j],dp[i-1][j-1]+1);
printf("%d ",dp[i][j]);
}
printf("\n");
}
printf("%d\n",dp[lena][lenb]);
}
return 0;
}
的程序的输入是从一个文本文件的长度。文件中的每个数据集包含两个字符串,表示给定的序列。序列分隔的任意数量的空格。输入的数据是正确的。对于每一组数据的程序从一开始一个单独的线的最大长度的公共子序列的长度在标准输出上打印。
题解:题目就是要求最长的非连续递增公共序列,可以用DP求解;
原题:http://acm.hdu.edu.cn/showproblem.php?pid=1159
状态转移函数:dp[i][j]=max{dp[i-1][j],dp[i][j-1]},若a[i-1]==b[j-1],则dp[i][j]=max{dp[i][j],dp[i-1][j-1]+1};
举例说明:abcfbc 与abfcab
a b c f b c
a 1 1 1 1 1 1
b 1 2 2 2 2 2
f 1 2 2 3 3 3
c 1 2 3 3 3 3
a 1 2 3 3 3 4
b 1 2 3 4 4 4
代码实现:
#include<stdio.h>
#include<iostream>
#include<cstring>
using namespace std;
#pragma comment(linker,"/STACK:102400000,102400000")
#define MAX 10001
int dp[MAX][MAX];
char a[MAX],b[MAX];
int max(int x,int y)
{
return(x>y?x:y);
}
int main()
{
//freopen("input.txt","r",stdin);
while(cin>>a>>b)
{
int lena=strlen(a);
int lenb=strlen(b);
memset(dp,0,sizeof(dp));
for(int i=1;i<=lena;i++)
{
for(int j=1;j<=lenb;j++)
{
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
if(a[i-1]==b[j-1])//对应字符相同,则dp[i-1][j-1]+1
dp[i][j]=max(dp[i][j],dp[i-1][j-1]+1);
printf("%d ",dp[i][j]);
}
printf("\n");
}
printf("%d\n",dp[lena][lenb]);
}
return 0;
}
相关文章推荐
- 最长公共子序列 最长递增子序列(和) 最长递增公共子序列 最长(连续)子序列乘积(HDU)--dp
- 最长递增公共子序列dp(hdu 1423 hdu 4512)
- 最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离
- 最长递增子序列(nlogn),最长公共子串(连续),最长公共子序列(不连续)
- 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串
- hdu 1087 Super Jumping! Jumping! Jumping!(dp+最长递增序列)
- hdu 4512(最长公共递增子序列加强版)
- 最大子序列,最长递增子序列,最长公共字串,最长公共子序列,字符串编辑距离
- hdu1025 Constructing Roads In JGShining's Kingdom(最长递增公共子序列二分法)
- POJ 2533 Longest Ordered Subsequence【最长递增子序列】【DP思想】
- 【简单dp】poj 2127 Greatest Common Increasing Subsequence【最长公共上升子序列】【模板】
- hdu 1423 最长递增公共子序列
- HDU1257 最长递增公共子序列问题
- nyoj+最长回文数,复制一个反转序列,然后求两个序列的最长公共字序列+也可以用区间dp做
- 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串 (转)
- 最长公共递增子序列(LCIS)
- 最长递增公共子序列(二)
- [ACM_动态规划] UVA 12511 Virus [最长公共递增子序列 LCIS 动态规划]
- DP之最长递增序列(利用二分查找,复杂度为nlgn)
- 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串