Codeforces Beta Round #10 D. LCIS(经典DP)

题目链接
在这里插入图片描述
题意:给定两个串求最长公共上升子序列

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=505;
int n,m,dp[maxn],a[maxn],b[maxn],pre[maxn];
void dfs(int ans)
{
	if(ans==0) return ;
	dfs(pre[ans]);
	printf("%d ",b[ans]);
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;++i) scanf("%d",&a[i]);
	scanf("%d",&m);
	for(int i=1;i<=m;++i) scanf("%d",&b[i]),pre[i]=0;
	for(int i=1;i<=n;++i)
	{
		int pos=0;
		for(int j=1;j<=m;++j)
		{
			if(a[i]==b[j]) dp[j]=dp[pos]+1,pre[j]=pos;
			if(a[i]>b[j]&&dp[pos]<dp[j]) pos=j;
		}
	}
	int ans=0,maxx=0;
	for(int i=1;i<=m;++i)
	{
		if(maxx<dp[i]) maxx=dp[i],ans=i;
	}
	printf("%d\n",maxx);
	dfs(ans);
}
发布了391 篇原创文章 · 获赞 1 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_42479630/article/details/105374839