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 ...
随机推荐
- 【bzoj1798】[Ahoi2009]Seq 维护序列seq
大意:一个数组,三个操作,第一种是区间[a,b]每个数乘乘,第二种是区间[a,b]每个数加c,第三种是查询[a,b]区间的和并对p取摸. 两种操作就不能简单的只往下传标记.每次传乘法标记时,要把加法标 ...
- Android编译详解之lunch命令 【转】
本文转载自: Android编译详解之lunch命令 (2012-10-08 10:27:55) 转载▼ 标签: it 分类: android内核剖析 Android的优势就在于其开源,手机和 ...
- 8-15 globalCompositeOperation阶段练习二
8-15 globalCompositeOperation阶段练习二 <!DOCTYPE html> <html lang="zh-cn"> <hea ...
- 洛谷 P1181,1182 数列分段Section
数列分段Section I 题目描述 对于给定的一个长度为N的正整数数列A[i],现要将其分成连续的若干段,并且每段和不超过M(可以等于M),问最少能将其分成多少段使得满足要求. 输入输出格式 输入格 ...
- POJ 3294 UVA 11107 Life Forms 后缀数组
相同的题目,输出格式有区别. 给定n个字符串,求最长的子串,使得它同时出现在一半以上的串中. 不熟悉后缀数组的童鞋建议先去看一看如何用后缀数组计算两个字符串的最长公共子串 Ural1517 这道题的思 ...
- Spark 二项逻辑回归__二分类
package Spark_MLlib import org.apache.spark.ml.Pipeline import org.apache.spark.ml.classification.{B ...
- PKUACM 2018 D chocolate【并查集+克鲁斯卡尔】
传送:http://poj.openjudge.cn/practice/C18D/ 依然是课件截图 #include<iostream> #include<cstdio> #i ...
- bzoj 1671: [Usaco2005 Dec]Knights of Ni 骑士【bfs】
bfs预处理出每个点s和t的距离d1和d2(无法到达标为inf),然后在若干灌木丛格子(x,y)里取min(d1[x][y]+d2[x][y]) /* 0:贝茜可以通过的空地 1:由于各种原因而不可通 ...
- SVN配置详解
原文:http://swjr.blog.com.cn/archives/2006/TheRoadToSubversion1authz.shtml http://www.dayuer.com/freeb ...
- 二分搜索 HDOJ 2289 Cup
题目传送门 /* 二分搜索:枚举高度,计算体积与给出的比较. */ #include <cstdio> #include <algorithm> #include <cs ...