求助dp方案记录
  • 板块CF10D LCIS
  • 楼主MrcFrst
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/7/17 15:47
  • 上次更新2023/11/3 09:19:33
查看原帖
求助dp方案记录
600671
MrcFrst楼主2023/7/17 15:47
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define il inline
#define re register
const int N=550;
int n,m,a[N],b[N],dp[N][N][N<<1],idx;
int tmp[N<<1],tot;
il int read(){
    re int x=0,f=1;char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+(c^48),c=getchar();
    return x*f;
}
int main(){
	n=read();
	for(re int i=1;i<=n;i++)a[i]=read(),tmp[++idx]=a[i];
	m=read();
	for(re int j=1;j<=m;j++)b[j]=read(),tmp[++idx]=b[j];
	sort(tmp+1,tmp+1+idx);
	tot=unique(tmp+1,tmp+1+idx)-tmp-1;
	for(re int i=1;i<=n;i++)a[i]=lower_bound(tmp+1,tmp+1+tot,a[i])-tmp;
	for(re int j=1;j<=m;j++)b[j]=lower_bound(tmp+1,tmp+1+tot,b[j])-tmp;
	for(re int i=1;i<=n;i++){
		for(re int j=1;j<=m;j++){
			for(re int k=1;k<=tot;k++)dp[i][j][k]=max(dp[i-1][j][k],dp[i][j-1][k]);
			if(a[i]==b[j]){
				dp[i][j][a[i]]=max(dp[i][j][a[i]],1);
				for(re int k=1;k<a[i];k++)dp[i][j][a[i]]=max(dp[i][j][a[i]],dp[i][j][k]+1);
			}
		}
	}
	int ans=-1;
	for(re int i=1;i<=tot;i++)ans=max(ans,dp[n][m][i]);
	printf("%d",ans);
    return 0;
}
2023/7/17 15:47
加载中...