hdu 4055 && hdu 4489 动态规划
一开始我想的递推方向想得很复杂,看了别人的博客后才醍醐灌顶:

参照他的思路和代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int mod = ;
const int N = ; char s[N];
int dp[N][N], sum[N][N]; int main() {
while(~scanf("%s",s + )) {
memset(dp,,sizeof(dp));
// memset(sum,0,sizeof(sum));
dp[][] = sum[][] = ;
int n = strlen(s + );
for(int i = ; s[i]; ++i) {
for(int j = ; j <= i; ++j) {
if(s[i] == 'I' || s[i] == '?')
dp[i][j] = (dp[i][j] + sum[i - ][j - ]) % mod;
if(s[i] == 'D' || s[i] == '?')
dp[i][j] = (dp[i][j] + (sum[i - ][i - ] - sum[i - ][j - ] + mod) % mod) % mod;
sum[i][j] = (sum[i][j - ] + dp[i][j]) % mod;
}
}
printf("%d\n",sum[n + ][n + ]);
}
return ;
}
用类似的思路我独自 A 出了这道题,只是需要对 dp 数组和 sum 数组加多一维记录当前第 i 位是凹点还是凸点:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL; LL dp[][][], sum[][][]; inline void init(int n = ) {
dp[][][] = dp[][][] = ;
sum[][][] = sum[][][] = ;
for(int i = ; i <= n; ++i) {
for(int j = ; j <= i; ++j) {
dp[i][j][] += sum[i - ][j - ][];
dp[i][j][] += (sum[i - ][i - ][] - sum[i - ][j - ][]);
sum[i][j][] = sum[i][j - ][] + dp[i][j][];
sum[i][j][] = sum[i][j - ][] + dp[i][j][];
}
}
} int main() {
int t,num,n;
init();
scanf("%d",&t);
while(t--) {
scanf("%d %d",&num,&n);
printf("%d %I64d\n", num, n == ? : sum[n][n][] + sum[n][n][]);
}
return ;
}
空间是可以优化的,不过对于这样的数据范围没必要。
hdu 4055 && hdu 4489 动态规划的更多相关文章
- HDU 4055 The King’s Ups and Downs(DP计数)
题意: 国王的士兵有n个,每个人的身高都不同,国王要将他们排列,必须一高一矮间隔进行,即其中的一个人必须同时高于(或低于)左边和右边.问可能的排列数.例子有1千个,但是最多只算到20个士兵,并且20个 ...
- HDU - 2222,HDU - 2896,HDU - 3065,ZOJ - 3430 AC自动机求文本串和模式串信息(模板题)
最近正在学AC自动机,按照惯例需要刷一套kuangbin的AC自动机专题巩固 在网上看过很多模板,感觉kuangbin大神的模板最为简洁,于是就选择了用kuangbin大神的模板. AC自动机其实就是 ...
- hdu 4055 动态规划
#include<map> #include<set> #include<cmath> #include<queue> #include<cstd ...
- Number String(HDU 4055,动态规划递推,前缀和优化)
点击加号查看代码 #include<bits/stdc++.h>//前缀和优化版本,不易理解 using namespace std; #define ll long long ; ; l ...
- The King’s Ups and Downs(HDU 4489,动态规划递推,组合数,国王的游戏)
题意: 给一个数字n,让1到n的所有数都以波浪形排序,即任意两个相邻的数都是一高一低或者一低一高 比如:1324 4231,再比如4213就是错的,因为4高,2低,接下来1就应该比2高,但是它没有 ...
- hdu FatMouse's Speed 动态规划DP
动态规划的解决方法是找到动态转移方程. 题目地址:http://acm.hdu.edu.cn/game/entry/problem/show.php?chapterid=3§ionid ...
- HDU 2059 龟兔赛跑(动态规划)
龟兔赛跑 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- HDU 4055 Number String dp
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4055 Number String Time Limit: 10000/5000 MS (Java/O ...
- hdu 4055 Number String
Number String http://acm.hdu.edu.cn/showproblem.php?pid=4055 Time Limit: 10000/5000 MS (Java/Others) ...
随机推荐
- 关于IllegalMonitorStateException异常
关于IllegalMonitorStateException异常: api中的解释 另请参见: Object.notify(), Object.notifyAll(), Object.wait(), ...
- java中基础类型的初始值,以及一些平时不注意的小知识
有时候总是卡在一些类型的初始值上,今天闲下来就来自己给自己记录一下. String a; 如果直接打印会提示未初始化.并且未初始化的a不能比较. 这时,我们定义个person类 person{ S ...
- hdu1081 To the Max
直接暴力枚举所有子矩形至少需要O(n^4)的复杂度,显然这不是一个合理的解决方法. 上述方案忽略了矩形之间的联系,进行了过多不必要的计算. 实际上如果固定矩形的左右边界,则底边在i行的矩形内数值之和与 ...
- Uva 10305 给任务排序
题目链接:https://uva.onlinejudge.org/external/103/10305.pdf 紫书P167 拓扑排序. dfs——从一个点出发,dfs 与之相连的所有点,把本身放入到 ...
- python两个dataframe的合并
见http://pandas.pydata.org/pandas-docs/stable/merging.html
- Javascript正则表达式笔记
一.字符类 将单独的直接字符放进[]内,就组成了字符类.一个字符类和它所包含的任何字符都匹配. 例如:/[abc]/ 与abc三个字母的任意一个匹配. 同时,还可以定义否定字符类.利用^字符.例如:/ ...
- HDU How many integers can you find 容斥
How many integers can you find Time Limit: 12000/5000 MS (Java/Others) Memory Limit: 65536/32768 ...
- ViewState
ViewState就像一个记录本,由于WebFormd的无状态性,刷新了页面.那么这个页面就和上一个页面没有任何关系了.为了使刷新前的页面和本页面产生联系,ViewState的作用就是记录刷新前页面的 ...
- shell中cut用法
cut是一个选取命令,就是将一段数据经过分析,取出我们想要的.一般来说,选取信息通常是针对“行”来进行分析的,并不是整篇信息分析的. (1)其语法格式为:cut [-bn] [file] 或 cut ...
- spark记录
Filtering multiple values in multiple columns: In the case where you're pulling data from a database ...