题目地址: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1733
初始化时,需要计算所有的f[0][i] 和 f[i][0] , 状态转方程是 f[i][j]= if (a[i]==b[j] ) f[i-1][j-1]+1 else max(f[i-1][j],f[i][j-1]) 数组开大一点· 【100】【100】 是错了的
代码:
#include <iostream>
#include<string>
using namespace std;
int f[1000][1000];
int max(int a,int b)
{
if(a>b) return a;
else return b;
}
int main()
{
string a,b;
while(cin>>a>>b)
{
int lengtha=a.length();
int lengthb=b.length();
for(int i=0;i<lengtha;i++)
{
int tag=0;
for(int j=0;j<=i;j++)
if(b[0]==a[j])
{
tag=1;
break;
}
if(tag==1)
f[i][0]=1;
else f[i][0]=0;
}
for(int i=0;i<lengthb;i++)
{
int tag=0;
for(int j=0;j<=i;j++)
if(a[0]==b[j])
{
tag=1;
break;
}
if(tag==1)
f[0][i]=1;
else f[0][i]=0;
}
for(int i=1;i<lengtha;i++)
for(int j=1;j<lengthb;j++)
{
if(a[i]==b[j]) f[i][j]=f[i-1][j-1]+1;
else f[i][j]=max(f[i-1][j],f[i][j-1]);
}
cout<<f[lengtha-1][lengthb-1]<<endl;
}
}