FZU 2129 子序列个数
2016-04-02 21:27
399 查看
题目链接:子序列个数
思路:使用一个数组(map超时了)记录一个数字在之前出现的位置,然后状态转移方程有两个,如果一个数字在之前出现过:dp[i] = (dp[i - 1] * 2 - dp[index[temp] - 1] + MOD) % MOD;,如果没有出现过:dp[i] = (dp[i - 1] * 2 + 1) % MOD;,这里注意减法取余需要加上MOD,否则可能出现负数。
dp这种东西,看比想容易的多了...23333我看懂了.....
思路:使用一个数组(map超时了)记录一个数字在之前出现的位置,然后状态转移方程有两个,如果一个数字在之前出现过:dp[i] = (dp[i - 1] * 2 - dp[index[temp] - 1] + MOD) % MOD;,如果没有出现过:dp[i] = (dp[i - 1] * 2 + 1) % MOD;,这里注意减法取余需要加上MOD,否则可能出现负数。
dp这种东西,看比想容易的多了...23333我看懂了.....
#include <stdio.h> #include <string.h> #include <iostream> #define mod 1000000007 using namespace std; int index[1000010]; long long dp[1000010]; int main() { int n; while(~scanf("%d", &n)) { memset(index, -1, sizeof(index)); memset(dp, 0, sizeof(dp)); dp[1] = 1; int temp; scanf("%d", &temp); index[temp] = 1; for (int i=2; i<=n; ++i) { scanf("%d", &temp); if (index[temp] == -1) { dp[i] = (((dp[i-1]%mod)*2)%mod+1)%mod; } else { dp[i] = (((dp[i-1]%mod)*2)%mod-dp[index[temp]-1]+mod)%mod; } index[temp] = i; } printf("%d\n", dp ); } return 0; }
相关文章推荐
- View的事件分发机制
- UVa524素数环
- 提高iOS开发效率的方法和工具
- BestCoder Round #78 CA Loves GCD
- 由Android 65K方法数限制引发的思考
- 代理模式
- jar命令成功完成 java -jar 命令却提示“没有主清单属性”!
- C++内存分配
- AR增强现实专用汉明码生成器+JAVA核心代码+程序
- Akka并发编程——第四节:Actor模型(三)
- 去除Spring tool suite/myeclipse/eclipse项目上有个红色感叹号
- 腾讯2016年实习生招聘笔试题
- Tuxedo介绍
- Xamarin 使用经验-字符集及动态编译
- HDU5656 CA Loves GCD (BC)
- Java通过代理server上网
- 教你在ubuntu下使用labview
- Android AndroidManifest.xml 详解
- Vrituoso安装经验总结
- Eclipse中的快捷键