一.求最长上升子序列:
设a[i]存储整个序列的数组,f[i]表示以i作为结尾求出的子序列的长度;
代码:(先求长度)
for(int i=1;i<=n;i++)
{
for(int j=1;j<i;j++)
{
if(a[j]<a[i])
f[i]=max(f[i].f[j]+1);
}
}
int ans=0;
for(int i=1;i<=n;i++)
ans=max(ans,f[i]);
printf("%d\n",ans); //即整个序列里的最长上升子序列长度为ans;
二.求最长公共子序列:
代码模板:
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=m;i++) cin>>b[i];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
f[i][j]=max(f[i-1][j],f[i][j-1]);
if(a[i]==b[j])
f[i][j]=max(f[i][j],f[i-1][j-1]+1);
}
}
ans=f[n][m]; //最长长度