ZOJ 3543 Number String
来源:互联网 发布:网络推广对企业的意义 编辑:程序博客网 时间:2024/05/16 06:01
大连赛区现场赛的E题。经典的简单DP。
设状态f[i][j]表示到达第i位以j结尾的方案数,则状态转移方程为:
如果为‘D’ 或者 ‘?’ 则:f[i][j] += sum(f[i-1][k]), j<=k<i
如果为'I'或者‘?’, 则:f[i][j] += sum(f[i-1][k]), 1<=k<j
最后统计一下就好了,这是个O(n^3)的算法,很显然地用部分和的思想优化一下就变成了O(n^2)的了。
PS:十分膜拜watashi大神的报告中的STL写法,太强大了.....
#include <iostream>#include <cstdio>#include <string>#include <cstring>#define Maxn 1010using namespace std;const int mod = 1000000007;string s;int f[Maxn][Maxn], n, ans;int sum[Maxn][Maxn];int main(){ while (getline(cin, s)) { memset(f, 0, sizeof(f)); memset(sum, 0, sizeof(sum)); f[0][0] = 1; n = s.length(); for (int i=1; i<=n; i++) sum[0][i] = 1; for (int i=1; i<=n; i++) { for (int j=1; j<=i+1; j++) { if (s[i-1] == 'I' || s[i-1] == '?') { f[i][j] += sum[i-1][j-1]; } if (s[i-1] == 'D' || s[i-1] == '?') { f[i][j] += (sum[i-1][i] - sum[i-1][j-1]); f[i][j] = (f[i][j] + mod) % mod; } sum[i][j] = (sum[i][j-1] + f[i][j]) % mod; } } ans = 0; for (int i=0; i<=n+1; i++) ans = (ans + f[n][i]) % mod; cout <<ans <<endl; } return 0; }
- ZOJ 3543 Number String
- ZOJ 3543 Number String
- zoj 3543 Number String
- zoj 3543 Number String(DP)
- Zoj 3543 Number String(dp)
- ZOJ 3543 Number String dp
- ZOJ 3543 Number String(dp)
- zoj 3543 - Number String(动规)
- ZOJ 3543 - Number String(dp)
- ZOJ Problem Set - 3543 Number String DP
- ZOJ 3543 Number String 【2011大连区域赛】【dp】
- Zoj 3543 Number String (dp) - 2011 ACM-ICPC Dalian Regional Contest Problem E
- Number String
- ZOJ 1039 Number Game
- zoj 1526 Big Number
- ZOJ 2829 Beautiful Number
- zoj 2105 Number Sequence
- zoj 1526 Big Number
- sql server2005 学习资料!求助!
- 飞秋0day
- 字符存在
- 解决 eclipse 3.7 字体偏小问题
- ThreadLocal的使用
- ZOJ 3543 Number String
- 线程信号量同步
- Java SE --- 新I\O
- 易经金钱占方法
- Windows技术文章汇集
- 隐式类型转换和explicit关键字的作用
- Java基础加强总结(5)(代理)
- Object-c学习笔记十四-----协议
- 编程珠玑第10章