DP


Description

对于一个排列,考虑相邻的两个元素,如果后面一个比前面一个大,表示这个位置是上升的,用 I 表示,反之这个位置是下降的,用 D表示。如排列 3,1,2,7,4,6,5 可以表示为 DIIDID。 现在给出一个长度为 n-1的排列表示,问有多少种 1 到n 的排列满足这种表示。

Input

一个字符串 S,S 由 I,D,?组成。?表示这个位置既可以为 I,又可以为 D

对于 20%的数据,S 长度 ≤ 10;

对于 100%的数据,S长度 ≤ 1000。

Output

有多少种排列满足上述字符串。输出排列数模 1000000007。

Sample Input

?D

Sample Output

3


这是一道比较裸的动态规划题目,dp[i][j]表示前 i 位数中,最后一位为第 j 大的方案数。即当转移到i时,前 i - 1 位数是1 ~ i-1 中的数。此时:

  1. 如果输入为 I,那么 j 可由 1 ~ j-1 转移过来,大于等于 j 的数都加一即可保证前 i 个数为1 ~ i;
  2. 如果输入为 D,则 j 可由 j ~ i-1 转移而来,同样,大于等于 j 的数字都加一。
  3. 如果输入为 ?,则将前两种方案加起来。

在实际转移过程中,不用涉及到大于等于 j 的数加一,只需知道转移原理即可。

但是如果直接这样转移当然是不行的,还需注意到,题目中 \(n <= 10^3\),

转移是\(n^3\),会超时。所以我们可以在转移之前维护一个前缀和即可去掉一个\(n\)。使时间复杂度降为\(n^2\)。如果害怕爆空间,还可以采用滚动数组进行优化。

Ps: 本题还有一个点需要注意,由于前缀和取了模,在算下降情况时,可能会出现负数,所以先加上一个mod再取模。

至此,问题完美解决。

代码

#include <cstdio>

int dp[2][1005];
const int mod = 1000000007; int main() {
dp[0][1] = 1;
int cur = 0;
char x = getchar();
int i = 1;
while(x == 'I'||x == 'D'||x == '?') {
cur ^= 1;i++;
for(int j = 1;j < i;j++)dp[cur^1][j] += dp[cur^1][j-1],dp[cur^1][j] %= mod,dp[cur][j] = 0; if(x == 'I') {
for(int j = 2;j <= i;j++)dp[cur][j] = dp[cur^1][j-1],dp[cur][j] %= mod;
}
if(x == 'D') {
for(int j = 1;j < i;j++)dp[cur][j] = dp[cur^1][i-1] - dp[cur^1][j-1] + mod,dp[cur][j] %= mod;
}
if(x == '?') {
for(int j = 2;j <= i;j++)dp[cur][j] = dp[cur^1][j-1],dp[cur][j] %= mod;
for(int j = 1;j < i;j++)dp[cur][j] += dp[cur^1][i-1] - dp[cur^1][j-1] + mod,dp[cur][j] %= mod;
}
x = getchar();
}
int ans = 0;
for(int j = 1;j <= i;j++)ans = (ans + dp[cur][j]) % mod;
printf("%d",ans); return 0;
}

[多校联考2 T3] 排列 (DP)的更多相关文章

  1. [多校联考2019(Round 5 T3)]青青草原的表彰大会(dp+组合数学)

    [多校联考2019(Round 5)]青青草原的表彰大会(dp+组合数学) 题面 青青草原上有n 只羊,他们聚集在包包大人的家里,举办一年一度的表彰大会,在这次的表彰大会中,包包大人让羊们按自己的贡献 ...

  2. [2019多校联考(Round 6 T3)]脱单计划 (费用流)

    [2019多校联考(Round 6 T3)]脱单计划 (费用流) 题面 你是一家相亲机构的策划总监,在一次相亲活动中,有 n 个小区的若干男士和 n个小区的若干女士报名了这次活动,你需要将这些参与者两 ...

  3. [多校联考2019(Round 5 T1)] [ATCoder3912]Xor Tree(状压dp)

    [多校联考2019(Round 5)] [ATCoder3912]Xor Tree(状压dp) 题面 给出一棵n个点的树,每条边有边权v,每次操作选中两个点,将这两个点之间的路径上的边权全部异或某个值 ...

  4. 【赛时总结】NOIP2018-三校联考1024

    ◇NOIP三校联考-1024◇ 发现以前的博客写得似乎都很水……基本上都没什么阅读量QwQ 决定改过自新╰( ̄ω ̄o) 就从这篇博客开始吧~ 现场考得无地自容,看到题解才发现一些东西……(我第三题还没 ...

  5. 【五校联考1day2】JZOJ2020年8月12日提高组T2 我想大声告诉你

    [五校联考1day2]JZOJ2020年8月12日提高组T2 我想大声告诉你 题目 Description 因为小Y 是知名的白富美,所以自然也有很多的追求者,这一天这些追求者打算进行一次游戏来踢出一 ...

  6. 三校联考 Day3

    三校联考 Day3 大水题 题目描述:给出一个圆及圆上的若干个点,问两个点间的最远距离. solution 按极角排序,按顺序枚举,显然距离最远的点是单调的,线性时间可解出答案. 大包子的束缚 题目描 ...

  7. [多校联考2019(Round 5 T2)]蓝精灵的请求(二分图染色+背包)

    [多校联考2019(Round 5)]蓝精灵的请求(二分图染色+背包) 题面 在山的那边海的那边住着 n 个蓝精灵,这 n 个蓝精灵之间有 m 对好友关系,现在蓝精灵们想要玩一个团队竞技游戏,需要分为 ...

  8. 【五校联考1day2】JZOJ2020年8月12日提高组T1 对你的爱深不见底

    [五校联考1day2]JZOJ2020年8月12日提高组T1 对你的爱深不见底 题目 Description 出乎意料的是,幸运E 的小R 居然赢了那个游戏.现在欣喜万分的小R 想要写一张明信片给小Y ...

  9. [2017/5/28]FJ四校联考

    来自FallDream的博客,未经允许,请勿转载,谢谢. 话说这一段时间算是过去了,好久好久之后终于又有联考了  没想到这次到我们学校出题,昨天才想起来,临时花一天赶了一套,我出了一个sbFFT,质量 ...

随机推荐

  1. thinkphp自定义权限管理之名称判断

    权限管理,就是给不同的用户分配不同的权限.当用户登录或者操作时候进行判断,来阻止用户进行权限以外的操作.本次讲的是当用户登录一刻,只显示权限开启的内容. 一.建立数据库. 1.权限表funcla.来存 ...

  2. EDI - Biztalk Sample

    1. EDI Control - Scripting Usage:

  3. Asp.net DropDownList 自定义样式(想怎么改就怎么改!)

    最近在做一个asp.net的项目,需要对默认的dropdownlist样式进行美化,固有的dropdownlist的小箭头实在让人无法接受,于是开始在百度,google 上下求索,天不负有心人,终于找 ...

  4. C语言输入多组问题~ungetc回退字符到stdin

    题目描述 输入数组长度 n 输入数组      a[1...n] 输入查找个数m 输入查找数字b[1...m]   输出 YES or NO  查找有则YES 否则NO . 输入描述: 输入有多组数据 ...

  5. nginx的worker_processes,worker_cpu_affinity及worker_connections

    worker_processes:nginx要开启的进程数,一般为cpu的核数 worker_cpu_affinity:为每个进程绑定一个cpu,减少cpu切换的开销 配置示例: worker_pro ...

  6. delete all untracked files

    git clean -f git clean -fdx f   file d  directory x   .gitignore

  7. Java 隐藏和覆盖

    我们知道,在JAVA中,子类可以继承父类,如果子类声明的方法与父类有重名的情况怎么办,大伙儿都知道要是重写,但是实际上这又分为两种情况,就是方法和变量在继承时的覆盖和隐藏问题,这些概念性的东西看似无聊 ...

  8. AFNetworking的原理与基本使用

    全称是AFNetworking 虽然运行效率没有ASI高,但是使用比ASI简单 是对NSURLConnection和NSURLSession的各自的一层包装 AFN的内部中的RunLoop AFN内部 ...

  9. 欢快的使用Unity JSON吧

    0x01:前言 Unity 5.3加入了UnityUtility类,意味着Unity终于有了自己原生态的JSON库.Unity主要用来游戏开发,JSON做为游戏开发中最受欢迎的配置文件.在官方没有库支 ...

  10. c#中浅拷贝和深拷贝的理解

    c#中拷贝有浅拷贝和深拷贝之分. 例如对象A,其中有值类型字段和引用类型字段: 1.浅拷贝: 对于值类型字段,直接逐位复制到新拷贝的副本对象中,修改副本的字段的值,不会影响源对象中字段的值: 对于引用 ...