• Codeforces Round #519 D


    题目

    题意:

      在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 }
    View Code
  • 相关阅读:
    代码抄袭检测系统的设计和实现(1)--需求分析和基础架构
    Protobuf C/C++实战笔记(1)
    自动构建Makefile(1)--C/C++编译流程&Makefile规则简介
    初识storm
    Ubuntu 16.04LTS安装Nginx
    redis内存监控与回收
    RabbitMQ交换机规则实例
    git合并分支上指定的commit
    git忽略掉文件权限检查
    git修改文件权限方式
  • 原文地址:https://www.cnblogs.com/thunder-110/p/9887117.html
Copyright © 2020-2023  润新知