acm--pku--1458
问题描述:
问题地址:http://poj.org/problem?id=1458
查看两个字符串相同子窜的最长长度。
举例子:
Sample Input
abcfbc abfcab programming contest abcd mnp
Sample Output
4 2 0
从这个例子中可以看出用简单的动态规划就可以了。状态转移的式子是
if(node1[i-1]==node2[j-1])
{
sum[i][j]=sum[i-1][j-1]+1;
}
else
{
if(sum[i][j-1]>sum[i-1][j])
sum[i][j]=sum[i][j-1];
else
sum[i][j]=sum[i-1][j];
}
全部代码为:
#include<iostream>
#include<string.h>
using namespace std;
int main()
{
int sum[210][210];
char node1[210];
char node2[210];
int m,n;
int i,j,k;
while(cin>>node1>>node2)
{
//scanf("%s",node1);
// scanf("%s",node2);
// if(node1==""&&node2=="")
// break;
i=0;
while(node1[i]!='\0')i++;
m=i;
i=0;
while(node2[i]!='\0')i++;
n=i;
for(i=0;i<=n;i++)
sum[0][i]=0;
for(i=0;i<=m;i++)
sum[i][0]=0;
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
if(node1[i-1]==node2[j-1])
{
sum[i][j]=sum[i-1][j-1]+1;
}
else
{
if(sum[i][j-1]>sum[i-1][j])
sum[i][j]=sum[i][j-1];
else
sum[i][j]=sum[i-1][j];
}
}
}
// printf("%d\n",sum[m][n]);
cout<<sum[m][n]<<endl;
}
return 0;
}

浙公网安备 33010602011771号