的程序的输入是从一个文本文件的长度。文件中的每个数据集包含两个字符串,表示给定的序列。序列分隔的任意数量的空格。输入的数据是正确的。对于每一组数据的程序从一开始一个单独的线的最大长度的公共子序列的长度在标准输出上打印。
题解:题目就是要求最长的非连续递增公共序列,可以用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
#include
#include
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;
}