zoukankan      html  css  js  c++  java
  • poj2127——LCIS

    题目:http://poj.org/problem?id=2127

    LCIS,注意存储路径的方法。

    代码如下:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #define ll long long
    using namespace std;
    ll n,a[505],m,b[505],f[505][505],mx,pre[505][505],ans,y,st,print[505];

    //void print(ll sx,ll sy)
    //{
    // if(f[sx][sy]==0)return;
    // ll xx=prex[sx][sy];
    // ll yy=prey[sx][sy];
    // print(xx,yy);
    // if(f[xx][yy]!=f[sx][sy])//免 f[i][j]=f[i-1][j] 情况
    // printf("%lld ",b[sy]);
    //}

    int main()
    {
        scanf("%lld",&n);
        for(ll i=1;i<=n;i++)
            scanf("%lld",&a[i]);
        scanf("%lld",&m);
        for(ll i=1;i<=m;i++)
            scanf("%lld",&b[i]);
        for(ll i=1;i<=n;i++)
        {
            mx=0;//!
            for(ll j=1;j<=m;j++)
            {
                f[i][j]=f[i-1][j];
                if(a[i]>b[j]&&mx<f[i-1][j])
                {
                    mx=f[i-1][j];
                    y=j;
                }
                else if(a[i]==b[j])
                {
                    f[i][j]=mx+1;
                    pre[i][j]=y;
                }
            }
        }
        for(ll j=1;j<=m;j++)
            if(f[n][j]>ans)
            {
                ans=f[n][j];
                y=j;
            }
        printf("%lld
    ",ans);
        ll x=n,cnt=0;
        while(f[x][y])  //
        {  
            if(a[x]!=b[y]) x--;  
            else print[ans-cnt]=b[y],cnt++,y=pre[x][y];  
        }  
        for(int i=1;i<=ans;i++)
            printf("%lld ",print[i]);
        return 0;
    }
  • 相关阅读:
    [HAOI2015] 数组游戏
    [HAOI2015] 数字串拆分
    [HAOI2015] 按位或
    [HAOI2009] 毛毛虫
    [HAOI2009] 巧克力
    [HAOI2011] Problem C
    [HAOI2011] 防线修建
    [HAOI2011] Problem A
    [HAOI2010] 最长公共子序列
    [HAOI2010] 工厂选址
  • 原文地址:https://www.cnblogs.com/Zinn/p/8538589.html
Copyright © 2011-2022 走看看