子序列的个数

来源:互联网 发布:cms会员系统 编辑:程序博客网 时间:2024/05/16 09:52

int  run(const int *a,int n)

{
   int i;
   long k[111];//k[i]保存所有子序列中,最后一项为i的子序列的个数。
   long lasttotol=0,totol=0;
   for(i=0;i<=110;i++) k[i]=0;

   //当n=j时求的子序列的个数,按子序列最后一项的值把个数分到k[0]~k[110]中;

   //把n=j时的每个子序列后面加上a[j+1]构成新子序列,再加上单独一个a[j+1]构成的子序列,就得到了n=j+1时的所有以a[j+1]结尾的子序列.

   //所以n=j+1时,k[a[j+1]]=(n=j时的总子序列个数)+1,

   //其它k[]不变.

   for(i=0;i<n;i++)//题目测试用例的a下标是从0开始的,不是按照题目介绍的1开始的.

   {

      lasttotol=totol;
      totol=(lasttotol+lasttotol+1) % 1000000007;
      totol=(1000000007+totol-k[a[i]]) % 1000000007;
      //totol=2*totol+1-k[a[i]];
      k[a[i]]=lasttotol+1;
   }
   return totol;
}