您的位置:首页 > 其它

51nod 子序列的个数(动态规划)

2016-07-26 22:15 176 查看
子序列的个数
给定一个正整数序列,序列中元素的个数和元素值大小都不超过105, 求其所有子序列的个数。注意相同的只算一次:例如 {1,2,1}有子序列{1} {2} {1,2} {2,1}和{1,2,1}。最后结果对10^9 + 7取余数。

输入

第1行:一个数N,表示序列的长度(1 <= N <= 100000)
第2 - N + 1行:序列中的元素(1 <= a[i] <= 100000)


输出

输出a的不同子序列的数量Mod 10^9 + 7。


输入示例

4
1
2
3
2


输出示例

13


请选取你熟悉的语言,并在下面的代码框中完成你的程序,注意数据范围,最终结果会造成Int32溢出,这样会输出错误的答案。
不同语言如何处理输入输出,请查看下面的语言说明。
【分析】

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

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <time.h>
#include <string>
#include <map>
#include <stack>
#include <vector>
#include <set>
#include <queue>
#define mod 1000000007
typedef long long ll;
using namespace std;
ll dp[1000006],have[1000006],a[1000006];
int n,cnt,m,h;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
dp[0]=1;
memset(have,0,sizeof(have));
for(int i=1;i<=n;i++)
{
if(have[a[i]]==0){dp[i]=(dp[i-1]*2)%mod;}
else {dp[i]=(dp[i-1]*2-dp[have[a[i]]-1]+mod)%mod;}
have[a[i]]=i;

}
cout<<(dp
-1)%mod<<endl;
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: