Number String(HDU 4055,动态规划递推,前缀和优化)
- #include<bits/stdc++.h>//前缀和优化版本,不易理解
- using namespace std;
- #define ll long long
- const ll maxn=;
- const ll mod=;
- ll sum[maxn][maxn];
- ll dp[maxn][maxn];
- char str[maxn];
- int main()
- {
- str[]='*';
- str[]='*';
- scanf("%s",str+);
- ll len=strlen(str)-;
- sum[][]=;
- dp[][]=;
- for(ll i=;i<=len;i++)
- for(ll j=;j<=i;j++)
- {
- if(str[i]=='I'||str[i]=='?')
- {
- dp[i][j]=(dp[i][j]+sum[i-][j-])%mod;
- }
- if(str[i]=='D'||str[i]=='?')
- {
- ll temp=((sum[i-][i-]-sum[i-][j-])%mod+mod)%mod;
- dp[i][j]=(dp[i][j]+temp)%mod;
- }
- sum[i][j]=(dp[i][j]+sum[i][j-])%mod;
- }
- cout<<sum[len][len]<<endl;
- }
前缀和优化版本,不易理解
- #include<bits/stdc++.h>
- using namespace std;
- #define ll long long
- const ll maxn=;
- const ll mod=;
- ll dp[maxn][maxn];
- char str[maxn];
- int main()
- {
- str[]='*';
- str[]='*';
- scanf("%s",str+);
- ll len=strlen(str)-;
- dp[][]=;
- for(ll i=;i<=len;i++)
- for(ll j=;j<=i;j++)
- {
- if(str[i]=='I')
- {
- for(ll k=;k<j;k++)
- {
- dp[i][j]+=dp[i-][k]%mod;
- }
- }
- else if(str[i]=='D')
- {
- for(ll k=j;k<i;k++)
- {
- dp[i][j]+=dp[i-][k]%mod;
- }
- }
- else
- {
- for(ll k=;k<=i;k++)
- {
- dp[i][j]+=dp[i-][k]%mod;
- }
- }
- }
- ll ans=;
- for(ll i=;i<=len;i++)
- {
- ans+=dp[len][i]%mod;
- }
- cout<<ans<<endl;
- // for(int i=1;i<=len;i++)//测验每一个dp是否符合预期
- // for(int j=1;j<=len;j++)
- // {
- // printf("%d ",dp[i][j]);
- // if(j==len)
- // printf("\n");
- // }
- }
超时版本,但是容易理解
思路用图表示
首先感谢糖栗子的博文http://www.cnblogs.com/tanglizi/p/9471078.html以及他的热心帮助
下面上图:
Number String(HDU 4055,动态规划递推,前缀和优化)的更多相关文章
- The King’s Ups and Downs(HDU 4489,动态规划递推,组合数,国王的游戏)
题意: 给一个数字n,让1到n的所有数都以波浪形排序,即任意两个相邻的数都是一高一低或者一低一高 比如:1324 4231,再比如4213就是错的,因为4高,2低,接下来1就应该比2高,但是它没有 ...
- 最长上升子序列(动态规划递推,LIS)
1759:最长上升子序列 题目: 总时间限制: 2000ms 内存限制: 65536kB 描述 一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的 ...
- 最大子段和(洛谷P1115,动态规划递推)
洛谷题目链接 题目赋值出来格式有问题,所以我就只放题目链接了 下面为ac代码 #include<bits/stdc++.h> #define ll long long using name ...
- HDU 4747 Mex 递推/线段树
题目链接: acm.hdu.edu.cn/showproblem.php?pid=4747 Mex Time Limit: 15000/5000 MS (Java/Others)Memory Limi ...
- SPOJ:Fibonacci Polynomial(矩阵递推&前缀和)
Problem description. The Fibonacci numbers defined as f(n) = f(n-1) + f(n-2) where f0 = 0 and f1 = 1 ...
- HDU - 2604 Queuing(递推式+矩阵快速幂)
Queuing Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- hdu 1723 DP/递推
题意:有一队人(人数 ≥ 1),开头一个人要将消息传到末尾一个人那里,规定每次最多可以向后传n个人,问共有多少种传达方式. 这道题我刚拿到手没有想过 DP ,我觉得这样传消息其实很像 Fibonacc ...
- [hdu 2604] Queuing 递推 矩阵快速幂
Problem Description Queues and Priority Queues are data structures which are known to most computer ...
- P1759 通天之潜水(不详细,勿看)(动态规划递推,组合背包,洛谷)
题目链接:点击进入 题目分析: 简单的组合背包模板题,但是递推的同时要刷新这种情况使用了哪些物品 ac代码: #include<bits/stdc++.h> using namespace ...
随机推荐
- 稀疏表达是要求信号在该模型下的sparse code,只有少数的non-zero elements
为什么sparse representation比起其它成分分析方法(DFT,Wavelet)能得到更好的效果? - 知乎 https://www.zhihu.com/question/241241 ...
- android:模拟水波效果的自己定义View
Github地址:https://github.com/nuptboyzhb/WaterWaveView 欢迎Fork.欢迎Star 1.先看效果 watermark/2/text/aHR0cDovL ...
- PHP MySQL mysql.sock的问题
SQLSTATE[HY000] [2002] No such file or directory 原因是找不到mysql.sock这个文件..一般出现的症状就是能用ip连接mysql.但不能使用loc ...
- java jmenu的替代方案
本来想实现一个类似jmenu的窗口,但是发现找了半天也没从L&F中找到实现menu的消失的头绪,最后还是使用了替代方案 使用JDialog来模拟一个menu的窗口,设置 setModel(fa ...
- 通过绑定ip地址可以暂时解决抢占ip问题
以前设置的路由器密码都忘记了 admin重复,在工作上遇到了 一个去除str左右两边的空格换行符回车等 trim
- python-----使用requirements.txt批量安装包
首先写一个 requirements.txt,格式如图: 然后使用命令行,到 requirements.txt 所在的目录下,执行命令: pip install -r requirements.txt ...
- DNS域名记录
DNS域名记录 DNS数据库 在DNS的解析过程中用到域名的解析资源的记录,这个解析记录在DNS当中称为DNS数据库. 这个数据库又分为正解和反解,正解就是从主机名到ip的过程,反解就是从ip反响解析 ...
- 每天一个 linux命令(35):ln 命令(转载)
转载:http://www.cnblogs.com/peida/archive/2012/12/11/2812294.html ln是linux中又一个非常重要命令,它的功能是为 某一个文件在另外一个 ...
- jquery input 赋值和取值
记录一下: 在写一个input赋值,二话不说就直接利用了$('#xx').val()来进行取值和赋值,取值ok,赋值后利用alert显示正确,但是在html上并没有正确的显示出来,后来改为使用如下代码 ...
- Hibernate的表之间的关系
表:A.B 一对多关系:A中的一个字段的记录(主键)引用B中的多个记录(外键) 多对一关系:A中的一个字段的记录(外键)引用B中的一个记录(主键) 一对一关系:A.B两个表的关联字段都是主键 多对多关 ...