AC wing 272. 最长公共上升子序列

 

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef pair<ld,ld> pdd;
const ld PI=acos(-1);
const ld eps=1e-9;
#define ls (o<<1)
#define rs (o<<1|1)
#define pb push_back
const int seed=131;
const int M = 3e3+7;
int dp[M][M];
/*
	dp[i][j] A1--Ai   和  B1--Bj  中以Bj为结尾的LCIS的长度
	状态转移:由于Bj已经确定
	dp[i][j]	if(A[i]!=B[j]) =dp[i][j-1]
				else =  max - dp[i-1][k]+1   (k<j,B[k]<B[j])
*/
int A[M],B[M];
int main()
{
	ios::sync_with_stdio(false);
    cin.tie(0);
    int n;
    cin>>n;
   	for(int i=1;i<=n;i++)
   	cin>>A[i];
   	for(int i=1;i<=n;i++)
   	cin>>B[i];
   	for(int i=1;i<=n;i++)
   	{
   		int val=0;
   		if(B[0]<A[i])val=dp[i-1][0];
   		for(int j=1;j<=n;j++)
	   	{
	   		if(A[i]!=B[j])dp[i][j]=dp[i-1][j];
	   		else
	   		{
	   			dp[i][j]=max(dp[i][j],val+1);
	   			/*for(int k=0;k<j;k++)
	   			{
	   				if(B[k]<A[i])
	   				dp[i][j]=max(dp[i][j],dp[i-1][k]+1);//类似LIS 
				}*/
			}
			if(B[j]<A[i])
	   			val=max(val,dp[i-1][j]);
		}
	}
	int ma=0;
	for(int i=1;i<=n;i++)
	ma=max(dp[n][i],ma);
	cout<<ma<<endl; 
  	return 0;
}

压缩空间

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef pair<ld,ld> pdd;
const ld PI=acos(-1);
const ld eps=1e-9;
#define ls (o<<1)
#define rs (o<<1|1)
#define pb push_back
const int seed=131;
const int M = 3e3+7;
int dp[M];
/*
	dp[i][j] A1--Ai   和  B1--Bj  中以Bj为结尾的LCIS的长度
	状态转移:由于Bj已经确定
	dp[i][j]	if(A[i]!=B[j]) =dp[i][j-1]
				else =  max - dp[i-1][k]+1   (k<j,B[k]<B[j])
*/
int A[M],B[M];
int main()
{
	ios::sync_with_stdio(false);
    cin.tie(0);
    int n;
    cin>>n;
   	for(int i=1;i<=n;i++)
   	cin>>A[i];
   	for(int i=1;i<=n;i++)
   	cin>>B[i];
   	for(int i=1;i<=n;i++)
   	{
   		int val=0;
   		for(int j=1;j<=n;j++)
	   	{
	   		if(B[j]<A[i])
	   			val=max(val,dp[j]);
	   		if(A[i]!=B[j])dp[j]=dp[j];//直接继承前面的 i-1 
	   		else
	   		{
	   			dp[j]=val+1;
	   			/*for(int k=0;k<j;k++)
	   			{
	   				if(B[k]<A[i])
	   				dp[i][j]=max(dp[i][j],dp[i-1][k]+1);//类似LIS 
				}*/
			}
		}
	}
	int ma=0;
	for(int i=1;i<=n;i++)
	ma=max(dp[i],ma);
	cout<<ma<<endl; 
  	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值