题目链接:https://cn.vjudge.net/problem/HDU-4055

题意

给一个序列相邻元素各个上升下降情况('I'上升'D'下降'?'随便),问有几种满足的排列。

例:ID

答:2 (231和132)

思路

第一次看这题,思路是没得。

又是最后讲题才知道咋写。

直接给方程了:

dp[i][j]表示满足以j为结尾的,长度为i的排列方案数。

str[i]'I': dp[i][j]=sum(dp[i-1][k]) (1<=k<=j-1)

str[i]'D': dp[i][j]=sum(dp[i-1][k]) (j<=k<=i)

str[i]=='?': dp[i][j]=sum(dp[i-1][k]) (1<=k<=i)

这里的I一定是没问题,D为啥是个这?

可以想像D的意思是在一个序列末尾插入一个大小为j元素,

这样的话,前面所有大于等于j的元素应该被加一才能满足是一个排列。

那么'?'亦然。

提交过程

WA×2 注意取模,正数也得加模取模,因为可能溢出?
AC 注意边界dp[1][1]=1, 没用滚动数组2152ms
AC 滚动数组1591ms, 省去了时间上的指针操作和空间

代码

#include <cstdio>
#include <cstring>
const int maxn=1e3+20;
const long long mod=1000000007;
long long dp[maxn];
char str[maxn]; int main(void){
while (scanf("%s", str)==1){
int len=strlen(str);
memset(dp, 0, sizeof(dp));
// for (int i=1; i<=len; i++) dp[0][i]=1;
dp[1]=1; for (int i=1; i<=len; i++){
long long sum[maxn];
sum[0]=0;
for (int j=1; j<=i; j++) sum[j]=(sum[j-1]+dp[j])%mod; for (int j=1; j<=i+1; j++){
dp[j]=0;
if (str[i-1]!='I') dp[j]=(dp[j]+sum[i]-sum[j-1])%mod;
if (str[i-1]!='D') dp[j]=(dp[j]+sum[j-1]-sum[0])%mod;
}
} long long sum=0;
for (int i=1; i<=len+1; i++)
sum=(sum+dp[i])%mod;
printf("%lld\n", (sum+mod)%mod);
} return 0;
}
Time Memory Length Lang Submitted
1591ms 1224kB 865 G++ 2018-08-13 09:19:28

HDU-4055 Number String 动态规划 巧妙的转移的更多相关文章

  1. HDU 4055 Number String dp

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4055 Number String Time Limit: 10000/5000 MS (Java/O ...

  2. hdu 4055 Number String

    Number String http://acm.hdu.edu.cn/showproblem.php?pid=4055 Time Limit: 10000/5000 MS (Java/Others) ...

  3. hdu 4055 Number String(有点思维的DP)

    Number String Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  4. hdu 4055 Number String (基础dp)

    Number String Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  5. HDU 4055 Number String:前缀和优化dp【增长趋势——处理重复选数】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4055 题意: 给你一个由'I', 'D', '?'组成的字符串,长度为n,代表了一个1~n+1的排列中 ...

  6. hdu 4055 Number String(dp)

    Problem Description The signature of a permutation is a string that is computed as follows: for each ...

  7. HDU 4055 Number String (计数DP)

    题意:由数字1到n组成的所有排列中,问满足题目所给的n-1个字符的排列有多少个,如果第i字符是‘I’表示排列中的第i-1个数是小于第i个数的. 如果是‘D’,则反之. 析:dp[i][j] 表示前 i ...

  8. HDU 4055 Number String(DP计数)

    题意: 给你一个含n个字符的字符串,字符为'D'时表示小于号,字符为“I”时表示大于号,字符为“?”时表示大小于都可以.比如排列 {3, 1, 2, 7, 4, 6, 5} 表示为字符串 DIIDID ...

  9. hdu 4055 Number String(递推DP)

    给一个只含‘I','D','?'三种字符的字符串,I表示当前数字大于前面的数字,D表示当前的数字小于前面一位的数字,?表示当前位既可以小于又可以大于. 问1~n的排列中有多少个满足该字符串. http ...

随机推荐

  1. chrome浏览器调试线上文件映射本地文件

    chrome浏览器调试线上文件映射本地文件 通过ReRes让chrome拥有路径映射的autoResponse功能. 前端开发过程中,经常会有需要对远程环境调试的需求.比如,修改线上bug,开发环境不 ...

  2. LeetCode 970. Powerful Integers (强整数)

    题目标签:HashMap 题目让我们找出所有独一的powerful integers 小于bound的情况下. 把 x^i 看作 a:把 y^j 看作b, 代入for loop,把所有的情况都遍历一遍 ...

  3. 更改App.config里的值并保存

    using System; using System.Collections.Generic; using System.Configuration; using System.IO; using S ...

  4. Codeforces Round #273 (Div. 2) B . Random Teams 贪心

    B. Random Teams   n participants of the competition were split into m teams in some manner so that e ...

  5. bzoj4403 序列统计——组合数学

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4403 一开始想了个 O(n) 的做法,不行啊... O(n)想法是这样的:先考虑递推,设 f ...

  6. JSP-Runoob:JSP 过滤器

    ylbtech-JSP-Runoob:JSP 过滤器 1.返回顶部 1. JSP 过滤器 JSP 和 Servlet 中的过滤器都是 Java 类. 过滤器可以动态地拦截请求和响应,以变换或使用包含在 ...

  7. Javascript中的Object对象

    Object是在javascript中一个被我们经常使用的类型,而且JS中的所有对象都是继承自Object对象的.虽说我们平时只是简单地使用了Object对象来存储数据,并没有使用到太多其他功能,但是 ...

  8. PCB InCAM 获取 JOB STEP 实现外挂脚本调试功能实现

    PCB CAM自动化基于Incam 打造,在测试时经常遇到调试障碍,每次自行对功能测试时,生成了exe脚本后,再到Incam里面运行,发现问题,再回来修改代码,非常不爽, 参考Genesis调试运行模 ...

  9. linux修改yum源

    在自己安装的CentOS6.5中使用yum安装软件,总是提示404错误信息,百度后发现原来要设置yum源. 在安装完CentOS后一般需要修改yum源,才能够在安装更新rpm包时获得比较理想的速度.国 ...

  10. vue-router路由加载两种模式

    路由安装npm install --save vue-router 安装完成后,打开package.json,如果看到这个"vue-router": 版本号, 就代表安装成功了   ...