[題解]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\n",ans);
    }
}

 

posted @ 2019-04-30 14:17  羊肉汤泡煎饼  阅读(107)  评论(0编辑  收藏  举报