您的位置:首页 > 其它

序列型动规模板

2016-04-22 17:00 375 查看

最长上升子序列(lis)

 1.O(n^2)

#include<cstdio>

const int maxn=10005;
int n,m;
int a[maxn],b[maxn],dp[maxn],pre[maxn];

void print_lcis(int now)//输出lcis
{
if(pre[now]) print_lcis(pre[now]);
printf("%d ",b[now]);
}

void solve()
{
int ans;//lcis在b中的末位置
for(int i=1;i<=n;i++)
{
int maxk=0,k=0;//到当前j为止满足1<=k<j且b[k]<b[j]的dp[k]的值以及k
for(int j=1;j<=m;j++)
{
if(b[j]<a[i]&&dp[j]>maxk) { maxk=dp[j]; k=j; }
if(b[j]==a[i])
{
dp[j]=maxk+1;
pre[j]=k;
if(dp[j]>dp[ans]) ans=j;
}
}
}
printf("%d\n",dp[ans]);
print_lcis(ans);
}

void init()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=m;i++) scanf("%d",&b[i]);
}

int main()
{
freopen("lcis.in","r",stdin);
freopen("lcis.out","w",stdout);
init();
solve();
fclose(stdin);
fclose(stdout);
return 0;
}
View Code

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: