题意:
在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型的。
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 }