hdu4055
hdu4055
题意
给出一个长度为 n - 1 的字符串,要求构造一个包含数字 [1, n] 的排列,从第二位开始,'I' 表示当前位数字比前一位大,'D' 表示当前位数字比前一位小,'?' 表示可大可小。问有多少满足条件的 n 的排列。
分析
设 dp[i][j] 为 [1, i] 已排列好,最后一位为 j 的方案数。
如果 s[i] = 'I', \(dp[i][j] = \sum_{k=1}^{j-1}{dp[i-1][k]}\);
如果 s[i] = 'D', \(dp[i][j] = \sum_{k=j}^{i-1}{dp[i-1][k]}\);
我们可以假定每次使第 i 位为 j 时,前面 >= j 的值都加 1 了,保证仍是一个完整的排列。
注意到我们主要用到的是 dp[i-1][k] 的累加和,可以让 sum[i - 1][k] 表示 \(\sum_{x=1}^{k}dp[i-1][x]\) 的和。
前缀和快速求解。sum数组可以改用滚动数组实现。
code
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAXN = 5005;
const int MOD = 1e9 + 7;
int dp[MAXN][MAXN];
int sum[MAXN][MAXN];
char s[MAXN];
int main() {
while(~scanf("%s", s)) {
int l = strlen(s);
sum[1][1] = 1;
for(int i = 2; i < l + 2; i++) {
for(int j = 1; j <= i; j++) {
if(s[i - 2] == 'I') {
dp[i][j] = sum[i - 1][j - 1];
} else if(s[i - 2] == 'D') {
dp[i][j] = (sum[i - 1][i - 1] - sum[i - 1][j - 1] + MOD) % MOD;
} else {
dp[i][j] = sum[i - 1][i - 1];
}
sum[i][j] = (sum[i][j - 1] + dp[i][j]) % MOD;
}
}
printf("%d\n", sum[l + 1][l + 1]);
}
return 0;
}
hdu4055的更多相关文章
- hdu4055 dp
http://acm.hdu.edu.cn/showproblem.php?pid=4055 Problem Description The signature of a permutation is ...
- HDU-4055:Number String
链接:HDU-4055:Number String 题意:给你一个字符串s,s[i] = 'D'表示排列中a[i] > a[i+1],s[i] = 'I'表示排列中a[i] < a[i+1 ...
- HDU-4055 Number String 动态规划 巧妙的转移
题目链接:https://cn.vjudge.net/problem/HDU-4055 题意 给一个序列相邻元素各个上升下降情况('I'上升'D'下降'?'随便),问有几种满足的排列. 例:ID 答: ...
- HDU4055 - number string(DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4055 思路:dp[i][j]表示处理前i个字符以j结尾可能的序列数. 当a[i]=='I'时,dp[i ...
- hdu4055 Number String
Number String Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- 动态规划-线性dp-hdu-4055
https://www.cnblogs.com/31415926535x/p/10423047.html 这道题是大连的某一年的现场赛的题hdu-4055 ,,,刚开始做线性dp的题,,看了好半天才看 ...
- camp待补
待修莫对 序列自动机 几何积分 沈阳 M 待删除背包 : 分组背包 K-LIS, K次二分(插到最后stop) 问题转化为LIS bzoj2131 hdu4055 最小线段覆盖环 实时路况 分治+f ...
- HDU-1864:最大报销额(浮点数01背包)
链接:HDU-4055:最大报销额 题意:现有一笔经费可以报销一定额度的发票.允许报销的发票类型包括买图书(A类).文具(B类).差旅(C类),要求每张发票的总额不得超过1000元,每张发票上,单类物 ...
- [总结-动态规划]经典DP状态设定和转移方程
马上区域赛,发现DP太弱,赶紧复习补上. #普通DP CodeForces-546D Soldier and Number Game 筛法+动态规划 待补 UVALive-8078 Bracket S ...
随机推荐
- Python远程调试Openstack
前言 由于开始着手openstack运维方面的东西,我这颗大白菜必须要学一学这个高端的东西啦. 准备 pycharm依赖于专业版(这里需要注意,我前面浪费了好多时间...)下载并安装pycharm,网 ...
- OpenStack 认证服务 KeyStone 服务注册(五)
创建服务实体和API端点 创建服务 openstack service create --name keystone --description "OpenStack Identity&qu ...
- node爬虫入门
爬虫其实就是模仿浏览器访问页面,然后把页面保存起来备用. 爬虫的方法,直接上代码: function getUrl(url,success,error){ let urlObj = urlParser ...
- MYSQL导入数据出现The MySQL server is running with the --secure-file-priv
MYSQL导入数据出现The MySQL server is running with the --secure-file-priv option so it cannot execute this ...
- 如何得到Slave应用relay-log的时间
官方社区版MySQL 5.7.19 基于Row+Position搭建的一主一从异步复制结构:Master->{Slave} ROLE HOSTNAME BASEDIR DATADIR IP PO ...
- C#并行计算 Parallel.Foreach&Parallel.For
Parallel.For(int fromInclude, int toExclude, Action<int> body) 栗子: Parallel.For(0, 10, (i) =&g ...
- 【转】SpringMVC Controller 介绍
转自:原文url 一.简介 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ...
- 如何提升mysql replication的性能&多线程传输二进制日志
1,最好使用内网或者专线链路传输binlog数据 (千兆网卡.还不够的话,bounding 技术,扩展带宽) 在my.cnf中强制使用内网ip传输数据bind-address=ip2,将二进制保存在独 ...
- Linux硬盘的检测(原创)
http://czmmiao.iteye.com/blog/1058215 概述 随着硬盘容量.速度的快速发展,硬盘的可靠性问题越来越重要,今天的单块硬盘存储容量可轻松达到1TB,硬盘损坏带来的影响非 ...
- crontab机会任务监控
<1>如何查看自己的计划任务是否成功的执行? 昨天crontab中的同步任务没有执行,不知道是什么原因没有执行,貌似任务hang住了,想查询一下crontab到底问题出在哪里,或者hang ...