点击加号查看代码
#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,动态规划递推,前缀和优化)的更多相关文章

  1. The King’s Ups and Downs(HDU 4489,动态规划递推,组合数,国王的游戏)

    题意: 给一个数字n,让1到n的所有数都以波浪形排序,即任意两个相邻的数都是一高一低或者一低一高 比如:1324   4231,再比如4213就是错的,因为4高,2低,接下来1就应该比2高,但是它没有 ...

  2. 最长上升子序列(动态规划递推,LIS)

    1759:最长上升子序列 题目: 总时间限制: 2000ms 内存限制: 65536kB 描述 一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的 ...

  3. 最大子段和(洛谷P1115,动态规划递推)

    洛谷题目链接 题目赋值出来格式有问题,所以我就只放题目链接了 下面为ac代码 #include<bits/stdc++.h> #define ll long long using name ...

  4. HDU 4747 Mex 递推/线段树

    题目链接: acm.hdu.edu.cn/showproblem.php?pid=4747 Mex Time Limit: 15000/5000 MS (Java/Others)Memory Limi ...

  5. SPOJ:Fibonacci Polynomial(矩阵递推&前缀和)

    Problem description. The Fibonacci numbers defined as f(n) = f(n-1) + f(n-2) where f0 = 0 and f1 = 1 ...

  6. HDU - 2604 Queuing(递推式+矩阵快速幂)

    Queuing Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  7. hdu 1723 DP/递推

    题意:有一队人(人数 ≥ 1),开头一个人要将消息传到末尾一个人那里,规定每次最多可以向后传n个人,问共有多少种传达方式. 这道题我刚拿到手没有想过 DP ,我觉得这样传消息其实很像 Fibonacc ...

  8. [hdu 2604] Queuing 递推 矩阵快速幂

    Problem Description Queues and Priority Queues are data structures which are known to most computer ...

  9. P1759 通天之潜水(不详细,勿看)(动态规划递推,组合背包,洛谷)

    题目链接:点击进入 题目分析: 简单的组合背包模板题,但是递推的同时要刷新这种情况使用了哪些物品 ac代码: #include<bits/stdc++.h> using namespace ...

随机推荐

  1. 【HNOI模拟By YMD】move

    Description 设P(n)为从(0,0)移动到点(n,0)的不同路径数目,移动的方式有以下三种:(x,y)->(x+1,y-1),(x,y)->(x+1,y),(x+y)-> ...

  2. luogu2827 蚯蚓

    题目大意 本题中,我们将用符号[c]表示对c向下取整,例如:[3.0」= [3.1」= [3.9」=3. 蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓 ...

  3. JVM系列-类加载机制

    简介 在java中,类的声明周期总共分为以下几种: 加载(Loading),验证(Verification),准备(Preparation),解析(Analysis), 初始化(Initializat ...

  4. E20171108-hm

    breadcrumb  n. 面包屑:面包心; 2.面包的松软(或柔软)部分;                    n.  网页导航区(a -> b -> c)

  5. git 删除本地仓库

    更新: 2017/06/27 修改格式,备注mac下的命令没测试过   windows: rm .git/ mac: sudo rm -rf .git/ 没验证

  6. J20170604-hm

    丸める   四舍五入 文字化け 乱码 わきまえる 弁える 辨别,识相 御構い 张罗,招待,款待 お構いなしに 不加考虑 しおり ブックマーク 书签 スタイルシート 样式表

  7. 手机访问PC网站自动跳转到手机网站代码

    方法一: <script type="text/javascript"> try { var urlhash = window.location.hash; if (! ...

  8. Linux学习笔记之Linux常用命令剖析-cat/chmod/cd

    1.cat:用于连接文件并打印到标准输出设备上.(使用权限:所有使用者) 语法格式:cat [-AbeEnstTuv] [--help] [--version] fileName 参数说明: -n 或 ...

  9. 2017青岛网络赛1008 Chinese Zodiac

    Chinese Zodiac Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) T ...

  10. ACM_Uppercase(水题)

    Uppercase Time Limit: 2000/1000ms (Java/Others) Problem Description: 给出一句中间无特殊符号的英语句子,要求将各单词的首字母改大写. ...