51nod 子序列的个数(动态规划)
2016-07-26 22:15
176 查看
子序列的个数
给定一个正整数序列,序列中元素的个数和元素值大小都不超过105, 求其所有子序列的个数。注意相同的只算一次:例如 {1,2,1}有子序列{1} {2} {1,2} {2,1}和{1,2,1}。最后结果对10^9 + 7取余数。
输入
输出
输入示例
输出示例
请选取你熟悉的语言,并在下面的代码框中完成你的程序,注意数据范围,最终结果会造成Int32溢出,这样会输出错误的答案。
不同语言如何处理输入输出,请查看下面的语言说明。
【分析】
dp[i] = dp[i – 1] * 2 如果a[i]不在之前出现
dp[i] = dp[i – 1] * 2 – dp[j – 1],如果a[i]最近在j的位置出现过。
View Code
给定一个正整数序列,序列中元素的个数和元素值大小都不超过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
相关文章推荐
- Nginx+Tomcat+Redis实现负载均衡、资源分离、session共享
- shiro令牌环
- Apache 服务器下载、安装、应用
- linux携带密码登录其他远程机
- Java 反射
- HDU 5762 Teacher Bo (暴力)
- 数据结构学习笔记之用Java实现双向链表
- [PointCloud] GICP
- hdu1527 取石子游戏 【威佐夫博弈】
- 如何使用Gson工具类,以及使用listview加载相应的解析项
- c# datetimepicker中format设置
- 77.You executed the following command to perform a backup of the USERS tablespace: SQL> ALTER TABLES
- java设计模式_装饰模式
- 用c++实现红黑树的判断、插入、遍历操作
- HDU 5084/BC 15C HeHe
- WebDriver之 RemoteWebDriver
- java对Redis基本操作
- 蒙特卡罗树搜索+深度学习 -- AlphaGo原版论文阅读笔记
- No.011 Container With Most Water
- 当你输入一个网址/点击一个链接,发生了什么?(以www.baidu.com为例)