http://acm.hdu.edu.cn/showproblem.php?pid=4055

题意:给一个仅包含‘I','D','?'的字符串,’I'表示前面的数字比后面的数字要小(Increase升序),'D'表示前面的数字比前面的数字要大(Decrease降序),'?'表示有可能是'I'也有可能是'D',长度为n的字符串就有n+1个数字,在这n+1个数字里面,问符合给出的字符串的条件的序列数有多少种。

思路:dp[i][j]的定义:i表示当前枚举到第i个字符(即长度为i+1的时候的序列),j表示当前序列长度为i+1的时候第i+1位插入的数是什么,dp[i][j]表示长度为i+1的序列末尾为j的序列数总共有多少种。

首先需要转化一个思维:即例如前面序列长度为3,假设s[4] = 'D', 那么加入当前的数的时候,即(3, 1, 2),现在枚举的是dp[4][1],即要插入1,那么可以当成前面大于等于1(j)的数全部+1,序列就变成(4, 2, 3, 1),因此可以用前面的来推出后面的。

当s[i]为'I'的时候,插入的数要比前面一位大,因此前面一位是(1~j-1)的时候都可以插入,所以dp[i][j] = dp[i-1][j-1] + ... + dp[i-1][1].

当s[i]为'D'的时候,插入的数要比前面一位小,前面说了,要插入的数j在前面重复的时候,可以把前面的大于等于j的数都+1,所以前面是(j~i)都可以插入(j也是可取的,因为+1就变成j+1了),dp[i][j] = dp[i-1][j] + ... + dp[i-1][i].

这个式子是可以处理出前缀和的,即每次都把dp[i][j] = dp[i][j-1]这样就可以累加起来了。

而且当前的i只和i-1有关,可以使用滚动数组,还有交C++如果MOD运算过多会超时。

 #include <bits/stdc++.h>
using namespace std;
typedef long long LL;
#define N 1010
const int MOD = 1e9 + ;
LL dp[][N];
char s[N];
int main() {
while(~scanf("%s", s + )) {
int n = strlen(s + );
memset(dp, , sizeof(dp));
int pre = , now = ;
dp[pre][] = ;
for(int i = ; i <= n; i++) {
for(int j = ; j <= i + ; j++) {
dp[now][j] = dp[now][j-]; // 前缀和
if(s[i] != 'I') dp[now][j] = (dp[now][j] + (dp[pre][i] - dp[pre][j-]) + MOD) % MOD;
if(s[i] != 'D') dp[now][j] = (dp[now][j] + dp[pre][j-]) % MOD;
}
pre ^= now; now ^= pre; pre ^= now;
}
printf("%lld\n", dp[n%][n+]);
}
return ;
}

HDU 4055:Number String(DP计数)的更多相关文章

  1. HDU 4055 Number String(DP计数)

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

  2. HDU 4055 Number String dp

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

  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

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

  6. HDU 4055 Number String (计数DP)

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

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

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

  8. hdu 4055 Number String(dp)

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

  9. hdu 4055 Number String(递推DP)

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

  10. HDU 4054 Number String

    HDU 4054 Number String 思路: 状态:dp[i][j]表示以j结尾i的排列 状态转移: 如果s[i - 1]是' I ',那么dp[i][j] = dp[i-1][j-1] + ...

随机推荐

  1. bigdata_ Kafka集群模式部署

    环境:kafka 0.8.1.1 基本概念 Kafka维护按类区分的消息,称为主题(topic) 生产者(producer)向kafka的主题发布消息 消费者(consumer)向主题注册,并且接收发 ...

  2. 漫谈 KVC 与 KVO

    KVC 与 KVO 无疑是 Cocoa 提供给我们的一个非常强大的特性,使用熟练可以让我们的代码变得非常简洁并且易读.但 KVC 与 KVO 提供的 API 又是比较复杂的,绝对超出我们不经深究之前所 ...

  3. wpf border内部元素内边角溢出问题 裁剪效果

    效果图 <Grid> <Border BorderThickness=" BorderBrush="#3c4d72" CornerRadius=&quo ...

  4. Introduction To The Smart Client Software Factory (CAB/SCSF Part 18)

    1. Shell This is the start-up project for the solution. It is very similar to the start-up projects ...

  5. Bootstrap 图片形状

    @{    Layout = null;}<!DOCTYPE html><html><head>    <meta name="viewport&q ...

  6. C# 查农历 阴历 阳历 公历 节假日

    原文:C# 查农历 阴历 阳历 公历 节假日 using System;using System.Collections.Generic;using System.Text; namespace ca ...

  7. 零元学Expression Blend 4 - Chapter 25 以Text相关功能就能简单做出具有设计感的登入画面

    原文:零元学Expression Blend 4 - Chapter 25 以Text相关功能就能简单做出具有设计感的登入画面 本章将交大家如何运用Blend 4 内的Text相关功能做出有设计感的登 ...

  8. 微信小程序把玩(四十)animation API

    原文:微信小程序把玩(四十)animation API 动画水还是比较深的,这里只是简单介绍下小程序中动画的一些属性和注意事项,做动画前一定要整理好思路将动画一步步分解,再进行组合!这里只做引入. w ...

  9. .NET Core2.1项目在Linux上使用验证码报Unable to load shared library 'gdiplus' or one of its dependencies

    -- ::, 线程ID:[] 日志级别:ERROR 出错类:WebApp.HttpGlobalExceptionFilter property:[(null)] - 错误描述:System.TypeI ...

  10. 反射:获取枚举类型的Name,Value,Description

    [Obsolete("请使用新的方法XXX")] //使用Obsolete特性来告诉使用者这是一个过期的方法 private static void Test() { Type t ...