题目链接: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. 浅谈API网关(API Gateway)如何承载API经济生态链

    序言 API经济生态链已经在全球范围覆盖, 绝大多数企业都已经走在数字化转型的道路上,API成为企业连接业务的核心载体, 并产生巨大的盈利空间.快速增长的API规模以及调用量,使得企业IT在架构上.模 ...

  2. Cocos2d-x v3.0正式版尝鲜体验【2】 Android平台移植

    今天没事又尝试了下3.0正式版关于Android平台的移植,把新建的项目移植了下.过程仅用了十分钟左右,什么概念?! 好吧,事实上我想说,这个版本号真的移植非常轻松啊,只是还没加上其它东西,只是就眼下 ...

  3. ios17--自定义控件2改进

    控制器: // // XMGViewController.h #import <UIKit/UIKit.h> @interface XMGViewController : UIViewCo ...

  4. Tiny4412 开发板 编译环境搭建【转】

    本文转载自:http://blog.csdn.net/beijiwei/article/details/51055369 版权声明:本文为博主原创文章,未经博主允许不得转载. /*********** ...

  5. tiny4412 裸机程序 九、串口排查驱动原因及字符图片显示【转】

    本文转载自:http://blog.csdn.net/eshing/article/details/37410571 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+]   一 ...

  6. loj 101 最大流

    冬令营送到我脸上的20分都没拿全 心态爆炸 冬令营前一天学的dinic 后一天才发出来 #include<iostream> #include<cstdio> #include ...

  7. bzoj3661

    网络流/贪心 网络流做法是对于每一列,如果一个兔子下一天继续可以存在,那么连一条容量为1的边,然后设立一个中转站,来控制可以换的数量,容量限制l.时限100s,能跑过去我的太慢了,一个点100s 正解 ...

  8. Android高级开发-布局渲染流程与优化

    CPU(中央处理器)与GPU(图像处理器) 主要是设计目标不同,针对不同的应用场景.多缓存多分支,适用于复杂的逻辑运算,主要负责Measure,Layout,Record,Execute的计算操作. ...

  9. 数塔问题mod 100(orz)

    看一下题目 和普通的数字三角形看似没啥区别(区别很大) 然后去想:DP方程 DP[i][j]=Max(DP[i-][j],DP[i-][j-])+a[i][j] ans=Max(DP[n][..n]) ...

  10. SPOJ 1811 SAM 初探

    思路: 一个串建SAM 另一个串在SAM上跑 //By SiriusRen #include <cstdio> #include <cstring> #include < ...