如题:http://poj.org/problem?id=1458
求最长公共升序子序列
dp[i][j]表示第一个串到i的子串和第二个子串到j的子串拥有的公共子序列的长度。
如果str1【i】=str2【j】,d[i][j]=d[i-1][j-1]+1;
否则d[i][j]=max(d[i][j-1],d[i-1][j]).
#include<cstdio>
#include<iostream>
#include<string>
using namespace std;
#define N 1001
int dp[N][N]={0};
int max(int x,int y)
{return x>y?x:y;}
int main()
{
string str1,str2;
int i,j;
while(cin>>str1>>str2)
{
memset(dp,0,sizeof(dp));
int len1=str1.length();
int len2=str2.length();
for(i=1;i<=len1;i++)
for(j=1;j<=len2;j++)
{
if(str1[i-1]==str2[j-1])
dp[i][j]=dp[i-1][j-1]+1;
else
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
printf("%d\n",dp[len1][len2]);
}
}