zoukankan      html  css  js  c++  java
  • [计数问题dp]子数列的个数

    http://www.51nod.com/tutorial/course.html#!courseId=15

    解题关键:主要是一种思想

        $dp[i] = dp[i - 1]*2$ 如果a[i]不在之前出现
        $dp[i] = dp[i - 1]*2 - dp[j - 1]$,如果a[i]最近在j的位置出现过。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 typedef long long ll;
     4 ll mod=1e9+7; 
     5 ll a[100002],have[100002],dp[100002];//have存的是位置 
     6 int main(){
     7     int n;
     8     cin>>n;
     9     for(int i=1;i<=n;i++){
    10         cin>>a[i];
    11     } //注意要从1开始读 
    12     dp[0]=1;
    13     for(int i=1;i<=n;i++){
    14         dp[i]=dp[i-1]*2%mod;
    15         if(have[a[i]]>0) dp[i]=(dp[i]-dp[have[a[i]]-1]+mod)%mod;
    16         have[a[i]]=i;
    17     }
    18     printf("%lld
    ",(dp[n]-1+mod)%mod);
    19 }
  • 相关阅读:
    双指针
    二分查找
    二叉树
    递归思想
    排序算法
    Java常用集合使用方法总结
    攻防世界-PHP文件包含
    正则表达式随笔
    ts 函数
    ts 联合类型
  • 原文地址:https://www.cnblogs.com/elpsycongroo/p/6847850.html
Copyright © 2011-2022 走看看