第一次写dp,感觉还不错,虽然在声明d数组时,用了char型,好衰。。。。。
写dp好有艺术感。
最长公共子序列(LCS)
2种解法,好像还有nlog(n)的算法。以后在写
#include<iostream>
#include<cstring>
#include<cstdio>
#define N 1020
using namespace std;
char a[N],b[N];
int lena,lenb,d[N][N];
int dp(int i,int j)
{
if(i>=lena||j>=lenb)return 0;
if(d[i][j]>=0)return d[i][j];
if(a[i]==b[j])return dp(i+1,j+1)+1;
return d[i][j]=max(dp(i+1,j),dp(i,j+1));
}
int main()
{
while(gets(a)!=NULL)
{
gets(b);
memset(d,-1,sizeof(d));
lena=strlen(a),lenb=strlen(b);
cout<<dp(0,0)<<endl;
}
return 0;
}
#include<cstring>
#include<cstdio>
#define N 1020
using namespace std;
char a[N],b[N];
int lena,lenb,d[N][N];
int dp(int i,int j)
{
if(i>=lena||j>=lenb)return 0;
if(d[i][j]>=0)return d[i][j];
if(a[i]==b[j])return dp(i+1,j+1)+1;
return d[i][j]=max(dp(i+1,j),dp(i,j+1));
}
int main()
{
while(gets(a)!=NULL)
{
gets(b);
memset(d,-1,sizeof(d));
lena=strlen(a),lenb=strlen(b);
cout<<dp(0,0)<<endl;
}
return 0;
}
#include<iostream>
#include<cstdio>
#include<cstring>
#define N 1005
using namespace std;
char a[N],b[N];
int d[N][N];
int main()
{
while(gets(a)!=NULL)
{
gets(b);
int lena=strlen(a),lenb=strlen(b);
for(int i=lena; i>=0; i--)
for(int j=lenb; j>=0; j--)
{
if(i==lena||j==lenb)d[i][j]=0;
else
{
if(a[i]==b[j])d[i][j]=d[i+1][j+1]+1;
else d[i][j]=max(d[i+1][j],d[i][j+1]);
}
}
cout<<d[0][0]<<endl;
}
return 0;
}
#include<cstdio>
#include<cstring>
#define N 1005
using namespace std;
char a[N],b[N];
int d[N][N];
int main()
{
while(gets(a)!=NULL)
{
gets(b);
int lena=strlen(a),lenb=strlen(b);
for(int i=lena; i>=0; i--)
for(int j=lenb; j>=0; j--)
{
if(i==lena||j==lenb)d[i][j]=0;
else
{
if(a[i]==b[j])d[i][j]=d[i+1][j+1]+1;
else d[i][j]=max(d[i+1][j],d[i][j+1]);
}
}
cout<<d[0][0]<<endl;
}
return 0;
}