• [題解]hdu_6412公共子序列


    https://blog.csdn.net/nka_kun/article/details/81902421


    #include<bits/stdc++.h>
    #define ll long long
    #define pb push_back
    using namespace std;
    const ll mod=1000000007;
    const int maxn=100010;
    int n,k,T,cnt;
    ll f[maxn];
    vector<int>v[6][1010];
    struct node{
        int p[6];
    //    bool operator <(const node&x)const{
    //        for(int i=1;i<=k;i++)
    //        if(p[i]<=x.p[i])return 0;
    //        return 1;
    //    }
        friend bool operator <(node x,node y){
            for(int i=1;i<=k;i++)
            if(x.p[i]>=y.p[i])return 0;
            return 1;
        }
    }a[maxn],b;
    void dfs(int x,int p){
        if(x==k+1)a[++cnt]=b;
        else{
            int s=v[x][p].size();
            for(int i=0;i<s;i++){
                b.p[x]=v[x][p][i];
                dfs(x+1,p);
            }
        }
    }
    bool cmp(node a,node b){
        for(int i=1;i<=k;i++)
        if(a.p[i]!=b.p[i])return a.p[i]<b.p[i];
        return 0;
    }
    int main(){
        scanf("%d",&T);
        while(T--){
            scanf("%d%d",&k,&n);
            for(int i=1;i<=k;i++)
            for(int j=1;j<=n;j++)v[i][j].clear();
            cnt=0;
            for(int i=1;i<=k;i++)
            for(int j=1,x;j<=n;j++)scanf("%d",&x),v[i][x].pb(j);//每個數出現位置 
            for(int i=1;i<=n;i++)
            dfs(1,i);
            
            sort(a+1,a+cnt+1,cmp);
            
            for(int i=1;i<=cnt;i++)f[i]=1;
            for(int i=1;i<=cnt;i++)
            for(int j=1;j<i;j++)
            if(a[j]<a[i])
            (f[i]+=f[j])%=mod;
            ll ans=0;
            for(int i=1;i<=cnt;i++)
            (ans+=f[i])%=mod;
            printf("%lld
    ",ans);
        }
    }
  • 相关阅读:
    awk
    Python自动化开发之python的常用模块
    sed
    python自动化开发-8
    正则表达式-2-正则表达式实战1
    linux之sort和uniq
    SSH免密登录
    Docker下安装Mongodb
    Docker下安装Elasticsearch
    Docker下安装RabbitMQ
  • 原文地址:https://www.cnblogs.com/superminivan/p/10795715.html
Copyright © 2020-2023  润新知