zoukankan      html  css  js  c++  java
  • P1410 子序列

    题目链接

     题解:

    如果不考虑长度限制,可以用二分图染色做。

    #include <bits/stdc++.h>
    # define LL long
    using namespace std;
    
    int n;
    int a[2001];
    int col[2001];
    
    struct Edge{
        int to;
        int next;
    }e[2001*2001];
    int head[2001];
    int en;
    
    void add(int from, int to){
        e[en].next=head[from];
        e[en].to=to;
        head[from]=en;
        ++en;
    }
    
    bool dfs(int u, int color){
        if(col[u]!=-1 && col[u]!=color) return false;
        if(col[u]!=-1 && col[u]==color) return true;
        col[u]=color;
        for(int i=head[u];i!=-1;i=e[i].next){
            int v=e[i].to;
            if(!dfs(v,1-color)) return false;
        }
        return true;
    }
    
    int main(){
        while(scanf("%d", &n)!=EOF){
            memset(head,-1,sizeof(head));
            en=0;
            for(int i=1;i<=n;++i){
                scanf("%d", a+i);
            }
            memset(col,-1,sizeof(col));
            for(int i=1;i<=n;++i){
                for(int j=i+1;j<=n;++j){
                    if(a[i]>=a[j]){
                        add(i,j);
                        add(j,i);
                    }
                }
            }
            int valid=1;
            for(int i=1;i<=n;++i){
                if(col[i]==-1){
                    if(!dfs(i,0)) {
                        valid=0;
                        break;
                    }
                }
            }
            if(valid==0) printf("No!
    ");
            else printf("Yes!
    ");
        }
        return 0;
    }

    以下是dp正解:

     from: https://www.luogu.com.cn/blog/user17123/solution-p1410

    #include <bits/stdc++.h>
    # define LL long
    using namespace std;
    
    const int INF=0x7fffffff;
    int n;
    int a[2001];
    int f[2001][2001];
    
    int main(){
        while(scanf("%d", &n)!=EOF){
            for(int i=1;i<=n;++i){
                scanf("%d", a+i);
            }
            for(int i=1;i<=n;++i){
                for(int j=1;j<=i;++j){
                    f[i][j]=INF;
                }
            }
            f[1][1]=-1;
            for(int i=1;i<=n;++i){
                for(int j=1;j<=i;++j){
                    if(f[i][j]<INF){
                        if(a[i+1]>a[i]){
                            f[i+1][j+1]=min(f[i+1][j+1],f[i][j]);
                        }
                        if(a[i+1]>f[i][j]){
                            f[i+1][i-j+1]=min(f[i+1][i-j+1],a[i]);
                        }
                    }
                }
            }
            if(f[n][n/2]==INF) printf("No!
    ");
            else printf("Yes!
    ");
        }
        return 0;
    }
  • 相关阅读:
    什么是透视图?
    Eclipse 视图
    Eclipse 菜单
    Eclipse 窗口说明
    Eclipse 修改字符集
    Eclipse 安装(Oxygen版本)
    Eclipse 教程
    jQuery 教程
    就表单验证说用户体验
    需要配置执行path?no
  • 原文地址:https://www.cnblogs.com/FEIIEF/p/12276097.html
Copyright © 2011-2022 走看看