涂颜色

牛牛管理着一片农场,在这片农场的一侧有着n块栅栏排成一排,为了给单调的
牧场生活增添一份乐趣,牛牛决定为这n块栅栏涂色。
现在,牛牛在牧场中一共找到了m种不同颜料,每种颜料都有自己的推荐方案,
如:第i种颜料罐上写着,在这种颜料后如果紧跟c1,C2,..….,ck这k种颜料中
的一个,整体色调就会显得不那么美丽。
那么,在满足上述前提下,牛牛最终完成的美丽的涂色一共会有多少种方案?
由于答案可能很大,所以只需要求出对10°+7取模后的结果。
输入描述:
本题为多组测试数据﹐第一行输入一个正整数T(1 ≤ T≤100),代表测
试数据组数·
对于每组测试数据﹐第一行输入三个正整数n,m,k(1 ≤n ≤
1000,1 ≤k <m≤10﹐代表栅栏总数﹐颜料总数以及每种颜料后不能
紧跟的颜料种类数·
接下去m行﹐每行输入k个正整数﹐c1,C2,...,ck(1 ≤ci≤m),代
表该种颜料后不能紧跟这k种颜色。
输出描述:
对于每组测试数据﹐输出一行一个数字表示牛牛的涂色方案·
示例1输入输出示例仅供调试,后台判题数据─般不包含示例
输入
1
2 2 1
1
1
输出
2
 

#include<bits/stdc++.h>
typedef long long int ll;
using namespace std;
int MOD=1000000007;
int main(){
    int T;
    cin>>T;
    while(T--){
        int n,m,k,tt;
        cin>>n>>m>>k;
        vector<vector<int>> v(m,vector<int>(m,1));
        for(int i=0;i<m;i++){
            for(int j=0;j<k;j++){
                cin>>tt;
                v[i][tt-1]=0;
            }
        }
        vector<int> res(m,1);
        for(int i=0;i<n-1;i++){
            vector<int> temp(m);
            for(int j=0;j<m;j++){
                int sss=0;
                for(int k=0;k<m;k++){
                    if(v[j][k]) sss=(sss+res[k])%MOD;
                }
                temp[j]=sss;
            }
            for(int j=0;j<m;j++) res[j]=temp[j];
        }
        int sum=0;
        for(int i=0;i<m;i++) sum=(sum+res[i])%MOD;
        cout<<sum<<endl;
        vector<int>().swap(res);
        vector<vector<int>>().swap(v);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_24624539/article/details/108453290