zoukankan      html  css  js  c++  java
  • FZU Problem 2129 子序列个数

    看了 dp 方程之后应该是妙懂

    每次 加入一个数,×2  然后剪掉重复的; 重复的个数 维前面那个数,,,,,

     1 #include<iostream>
     2 #include<stdio.h>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<cmath>
     6 #define mod 1000000007
     7 using namespace std;
     8 
     9 long long dp[1123456],pre[1123456];
    10 int main( )
    11 {
    12     int N;
    13     while( scanf("%d",&N) != EOF )
    14     {
    15         memset( pre,0,sizeof( pre) );
    16         memset( dp,0,sizeof(dp) );
    17         int now; scanf("%d",&now); dp[1] = 1; pre[now] = 1;
    18         for( int i = 2; i <= N; i++ )
    19         {
    20             int now; scanf("%d",&now);
    21             dp[i] = (((dp[i-1]*2)%mod) - dp[pre[now]-1]);
    22             if( !pre[now] )dp[i] += 1;
    23             pre[now] = i;
    24             dp[i] += mod;
    25             dp[i] %= mod;
    26         }
    27         printf("%lld
    ",dp[N]);
    28     }
    29     return 0;
    30 }
    View Code
  • 相关阅读:
    整理牙刷
    color 圆盘染色
    数论の一波流[长期更新]
    生成树
    一维黑白棋
    Factorials
    平面分割问题
    poj1183 反正切函数
    烽火传递
    校门外的树
  • 原文地址:https://www.cnblogs.com/wulangzhou/p/3360166.html
Copyright © 2011-2022 走看看