POJ 1458 最长公共子序列
(1)状态:dp[i][j]表示string a 前i个字符和 string b前j个字符 的最长公共子序列长度
(2)方程:if(a[i]==b[j]) dp[i][j]=dp[i-1][j-1]+1; else dp[i][j]=max(dp[i][j-1],dp[i-1][j])
(3)初值:dp[i][0]=0; dp[0][j]=0;
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
int main()
{
int dp[100][100];
string a,b;
int i,j;
while(cin>>a>>b)
{
for( i=0; i<=a.length(); i++)
dp[i][0]=0;
for( j=0; j<=b.length(); j++)
dp[0][j]=0;
for( i=1; i<=a.length(); i++)
{
for( j=1; j<=b.length(); j++)
{
if(a[i-1]==b[j-1])
dp[i][j]=dp[i-1][j-1]+1;
else
dp[i][j]=(dp[i-1][j]>dp[i][j-1])?dp[i-1][j]:dp[i][j-1];
}
}
cout<<dp[a.length()][b.length()]<<endl;
}
return 0;
#include <cstring>
#include <string>
using namespace std;
int main()
{
int dp[100][100];
string a,b;
int i,j;
while(cin>>a>>b)
{
for( i=0; i<=a.length(); i++)
dp[i][0]=0;
for( j=0; j<=b.length(); j++)
dp[0][j]=0;
for( i=1; i<=a.length(); i++)
{
for( j=1; j<=b.length(); j++)
{
if(a[i-1]==b[j-1])
dp[i][j]=dp[i-1][j-1]+1;
else
dp[i][j]=(dp[i-1][j]>dp[i][j-1])?dp[i-1][j]:dp[i][j-1];
}
}
cout<<dp[a.length()][b.length()]<<endl;
}
return 0;
}