【NOIP2017提高A组集训10.25】凤凰院凶真(dp)

来源:互联网 发布:日本轴承知乎 编辑:程序博客网 时间:2024/05/16 14:05

Description

这里写图片描述

Input

这里写图片描述

Output

这里写图片描述

Sample Input

5
1 4 2 5 1
4
1 1 2 4

Sample Output

2
1 4

Data Constraint

这里写图片描述


题解

这题我考场上想到了各种玄学复杂度的方法,然后没写一种,直接调T2去了
T2也没调出来,结果是我T2树状数组出了一个诡异的问题,然后100->0。。。
这个题其实就是个dp
dp[i][j]aibj
然后就是那几个限制条件下找max,然后具体可以看我代码
话说这代码是我抄的,因为我的调不出来。。。
hzy大神还开了滚动,自己看吧。
代码:

#include<cstdio>#include<cstring>#include<iostream>#include<cmath>#include<algorithm>#include<cstdlib>#include<vector>#define ll long longusing namespace std;inline int read(){    int x=0;char ch=' ';int f=1;    while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();    if(ch=='-')f=-1,ch=getchar();    while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();    return x*f;}int n,m;int a[5001],b[5001],dp[5001],pre[5001][5001];inline void print(int x,int dep){    if(dep==0)return;    print(pre[dep][x],dep-1);    printf("%d ",b[x]);}int main(){    freopen("okarin.in","r",stdin);    freopen("okarin.out","w",stdout);    n=read();    for(int i=1;i<=n;i++){        a[i]=read();    }    m=read();    for(int i=1;i<=m;i++){        b[i]=read();    }    for(int i=1;i<=n;i++){        int k=0;        for(int j=1;j<=m;j++){            if((a[i]==b[j])&&(dp[j]<dp[k]+1)){                dp[j]=dp[k]+1;                pre[dp[j]][j]=k;            }            if(a[i]>b[j]&&dp[j]>dp[k]){                k=j;            }        }    }    int ans=0,j=0;    for(int i=1;i<=m;i++){        if(ans<dp[i]){            ans=dp[i];            j=i;        }    }    printf("%d\n",ans);    print(j,ans);    return 0;}
阅读全文
0 0
原创粉丝点击