hdu 4055 Number String (基础dp)
2017-03-22 01:44
495 查看
Number String
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1935 Accepted Submission(s): 931
[align=left]Problem Description[/align]
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.
[align=left]Input[/align]
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'.
[align=left]Output[/align]
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.
[align=left]Sample Input[/align]
II
ID
DI
DD
?D
??
[align=left]Sample Output[/align]
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.
[align=left]Author[/align]
HONG, Qize
基础dp
字符串长度为n,则有(n+1)个数字组成排列。
dp[i][j]代表长度为i末位为j的符合题意的全排列总数,所以这样的排列内没有大于i的数。
显然dp[1][1]=1;
对于i>1,若对应的字符为‘I’,那么$dp[i][j]=\sum_{k=1}^{j-1}dp[i-1][k]$,这个显而易见。
若对应的字符为'D',那么$dp[i][j]=\sum_{k=j}^{i-1}dp[i-1][k]$,这个其实相当于在i位置放入j以后,把i全排列中i-1及之前的位置大于j的数字+1,构成新的排列。
那么对应的字符为“?”,则是把上两种情况综合,$dp[i][j]=\sum_{k=1}^{i-1}dp[i-1][k]$,显而易见。
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #define clr(x) memset(x,0,sizeof(x)) 5 #define LL long long 6 #define mod 1000000007 7 using namespace std; 8 LL dp[1010][1010],ans; 9 char s[1010]; 10 int main() 11 { 12 while(scanf("%s",s)!=EOF) 13 { 14 dp[1][1]=1; 15 for(int i=2;i<=strlen(s)+1;i++) 16 { 17 if(s[i-2]=='I') 18 { 19 dp[i][1]=0; 20 for(int j=2;j<=i;j++) 21 dp[i][j]=(dp[i][j-1]+dp[i-1][j-1])%mod; 22 } 23 if(s[i-2]=='D') 24 { 25 dp[i][i]=0; 26 for(int j=i-1;j>=1;j--) 27 dp[i][j]=(dp[i][j+1]+dp[i-1][j])%mod; 28 } 29 if(s[i-2]=='?') 30 { 31 dp[i][1]=0; 32 for(int j=1;j<=i-1;j++) 33 dp[i][1]=(dp[i][1]+dp[i-1][j])%mod; 34 for(int j=2;j<=i;j++) 35 dp[i][j]=dp[i][j-1]; 36 } 37 } 38 ans=0; 39 for(int i=1;i<=strlen(s)+1;i++) 40 ans=(ans+dp[strlen(s)+1][i])%mod; 41 printf("%lld\n",ans); 42 } 43 return 0; 44 }
相关文章推荐
- hdu 4055 Number String(dp)
- HDU 4055 Number String【DP递推+递推优化】【好题】
- HDU 4055 Number String(DP)
- hdu 4055 Number String(递推DP)
- [DP]HDU 4055 Number String
- hdu 4055 Number String(有点思维的DP)
- hdu 4055 Number String (经典dp)
- HDU 4055 Number String(DP计数)
- HDU 4055 Number String(11年大连区域赛-E题-DP)
- HDU 4055 Number String (计数DP)
- HDU 4055 Number String(计数dp)
- HDU 4055 Number String (dp的思想)
- HDU 4055 Number String (线性dp)
- HDU 4055 Number String(不错的DP题)
- HDU 4055 Number String(dp)
- HDU 4055 Number String (dp的思想)
- HDU 1561 The more, The Better - 依赖背包+树形dp基础
- 基础DP-第一类斯特林数-递推-hdu-3625-挑战程序设计2-q
- HDU 3555 Bomb 基础数位dp
- HDU-2059龟兔赛跑(基础方程DP-遍历之前的所有状态)