Codeforces Round #519 D - Mysterious Crime

题目

题意:

  在m组数,每组有n个数(数的范围1-n)中,找到某些序列 使它是每组数的一个公共子序列,问这样的某些序列的个数?

思路:

      不难想出答案ans是≥n的。

       创立一个next数组,使每组中第i个数的next 是第i+1个数,即 nex[ a[i] ] = a[ i+1 ] (实际上设next是二维数组)。对第一组中的第i个数,如果在其余每组的next[ a[ i ] ]都是等于第一组中a[ i+1 ]的,意味着序列 a[ i ],a[ i+1 ]是一个公共子序列。       利用一个数组 d[ ],d[ i ]记做 第 i 个数到第1个数之间满足条件的子序列的个数 。对 i ,如果满足条件,是公共子序列的话,d[ i ]=d[ i-1 ] + d[ i ],当然初始的时候 d[ i ] =1 。

答案是 long long型的。

扫描二维码关注公众号,回复: 3869766 查看本文章
 1 int n,m,a[11][N];
 2 int nex[11][N];
 3 ll d[N];
 4 
 5 int main()
 6 {
 7     cin>>n>>m;
 8     for(int i=1;i<=m;i++)
 9     {
10         for(int j=1;j<=n;j++)
11         {
12             scanf("%d",&a[i][j]);
13             nex[i][a[i][j-1]]=a[i][j];
14         }
15     }
16     
17     d[1]=1;
18     for(int i=1;i<=n-1;i++)
19     {
20         int x=a[1][i];
21         int flag=0;
22         d[i+1]=1;
23         for(int j=2;j<=m;j++)
24         {
25             if(a[1][i+1] != nex[j][x] ){
26                 flag=1; break;
27             }
28         }
29         if(!flag) d[i+1]+= d[i];
30     }
31     
32     ll ans=0;
33     
34     for(int i=1;i<=n;i++)
35     {
36         ans+=d[i];
37     }
38     cout<<ans<<endl;
39 }
View Code

猜你喜欢

转载自www.cnblogs.com/thunder-110/p/9887117.html