题干:
The signature of a permutation is a string that is computed as follows: for each pair of consecutive elements of the permutation, write down the letter 'I' (increasing) if the second element is greater than the first one, otherwise write down the letter 'D' (decreasing). For example, the signature of the permutation {3,1,2,7,4,6,5} is "DIIDID".
Your task is as follows: You are given a string describing the signature of many possible permutations, find out how many permutations satisfy this signature.
Note: For any positive integer n, a permutation of n elements is a sequence of length n that contains each of the integers 1 through n exactly once.
Input
Each test case consists of a string of 1 to 1000 characters long, containing only the letters 'I', 'D' or '?', representing a permutation signature.
Each test case occupies exactly one single line, without leading or trailing spaces.
Proceed to the end of file. The '?' in these strings can be either 'I' or 'D'.
Output
For each test case, print the number of permutations satisfying the signature on a single line. In case the result is too large, print the remainder modulo 1000000007.
Sample Input
II ID DI DD ?D ??
Sample Output
1 2 2 1 3 6
Hint
Permutation {1,2,3} has signature "II". Permutations {1,3,2} and {2,3,1} have signature "ID". Permutations {3,1,2} and {2,1,3} have signature "DI". Permutation {3,2,1} has signature "DD". "?D" can be either "ID" or "DD". "??" gives all possible permutations of length 3.
题目大意:
给你一个含n个字符的字符串,字符为'D'时表示小于号,字符为“I”时表示大于号,字符为“?”时表示大小于都可以。比如排列 {3, 1, 2, 7, 4, 6, 5} 表示为字符串 DIIDID。任务是计算所有能产生给定字符串的序列数量,每个序列含n+1个数字,分别为1~n+1,即从1开始且不重复。
一句话题意:给一个序列相邻元素各个上升下降情况('I'上升'D'下降'?'随便),问有几种满足的排列。例:ID 答:2 (231和132)
解题报告:
因为最终是一个排列,观察性质,n个数1~n,如果是一个排列a的话,你去掉a[n]之后,并且让所有大于a[n]的数都-1,会构成一个新的排列。所以定义状态dp[i][j]为构造了i个数并且是i个数的排列,并且最后一个数是j的方案数。
转移的时候,dp[i][j],如果字符串s[i]=='I'说明上一个字符可以任意取1~i-1;
如果s[i]=='D',同理,我可以任选一个比较小的并且使得比他大的增加1即可。
AC代码:
#include
#include
#include
#include
#include
#include