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 ...
随机推荐
- SNAPSHOTTING
/etc/redis.conf ################################ SNAPSHOTTING ################################## Sav ...
- USACO Section 1.2PROB Transformations
挺有趣的一道题,呵呵,不算难 /* ID: jusonal1 PROG: transform LANG: C++ */ #include <iostream> #include <f ...
- bzoj1531
背包+倍增 直接背包跑不过去,那么我们把容量分成二进制,然后原来需要枚举c次就只用枚举log(c)次了,这样还是能组合出任意小于等于c的组合方案 #include<bits/stdc++.h&g ...
- ubuntu16.04 查看系统可用内存
free -m 查看内存情况 (单位MB) mem 行显示了从系统角度看来内存使用的情况, total是系统可用的内存大小, 数量上等于系统物理内存减去内核保留的内存. buffers和cach ...
- 安装Git(转载)
转自:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/00137396287703 ...
- E20170531-hm
passage n. 通路; 通道 discrete adj. 分离的,不相关联的; 分立式; 非连续; alternative 替代的; 另类的; 备选的; 其他的; intent ...
- 学习css盒子模型
在这一周,我学习了css,在没有学习css之前,我一直都觉得布局很难,样式特别难调,但是学习了css盒子模型之后我就觉得欸,其实还挺简单的,下面就来看看我学习的css吧. CSS 盒子模型(Box M ...
- redis的持久化的原理介绍和实现
redis提供了持久化功能——RDB和AOF.通俗的讲就是将内存中的数据写入硬盘中. RDB一定时间取存储文件,AOF默认每秒去存储历史命令,官方建议两种方式同时使用 一.RDB(Redis Data ...
- 分享几篇有关react-native的博客
http://segmentfault.com/a/1190000002646155 http://facebook.github.io/react-native/docs/native-module ...
- [CREC2007/CQOI2014]robotic sort
Description 一个实验室里有n个长短不一的试管.你的任务是编写一段程序,用机器臂把它们按照高度从小到大的顺序排列. 对于高度相同的试管,排序前后的相对位置应保持不变.排序方法如图所示. 排序 ...