博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU4055:Number String(DP)
阅读量:7044 次
发布时间:2019-06-28

本文共 2711 字,大约阅读时间需要 9 分钟。

reference:http://blog.csdn.net/jayye1994/article/details/12361481

Number String

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1945    Accepted Submission(s): 938


Problem Description
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.
 

Author
HONG, Qize
 

Source
题意:略。

思路:有技巧的dp,dp[i][j]表示处理到第i位数,以j结尾的方案数,如果s[i]为'I',dp[i][j] = dp[i-1][j-1] + dp[i-1][j-2] + ... dp[i-1][1]。如果s[i]为'D',dp[i][j] = dp[i-1][j+1] +dp[i-1][j+2] +...+dp[i-1][i]。

如果j在前面已经出现过了,那么可以理解为将前面>=j的数都加1,下面代码用前缀和表示。

# include 
# include
# include
# define ll long long# define MOD 1000000007using namespace std;ll sum[1003][1003];int main(){ char s[1003]; while(~scanf("%s",s)) { sum[0][1] = 1; int len = strlen(s); for(int i=1; i<=len; ++i) { for(int j=1; j<=i+1; ++j) { sum[i][j] = sum[i][j-1]; if(s[i-1] != 'D') sum[i][j] += sum[i-1][j-1]; if(s[i-1] != 'I') sum[i][j] += sum[i-1][i] - sum[i-1][j-1] + MOD; sum[i][j] %= MOD; } } printf("%lld\n",sum[len][len+1]); } return 0;}

转载于:https://www.cnblogs.com/junior19/p/6729891.html

你可能感兴趣的文章
linux的防火墙firewalld和iptables区别和用法
查看>>
网易游戏QA工程师笔试回忆-2012.9【个人题解】
查看>>
详解 JSONP跨域请求的实现
查看>>
Oracle 修改文件所有者
查看>>
CocoaPods could not find compatible versions for pod "xxx": In snapshot (Podfile.lock):
查看>>
python发送邮件
查看>>
SilverLight 5 数据绑定
查看>>
ElasticSearch 结构化搜索全文
查看>>
带有进度条的圆周率计算
查看>>
bootstrap插件(对话框)bootbox参数和自定义弹出框宽度设置
查看>>
【转】我眼中的傅盛:为互联网混战而生
查看>>
OO第二次博客作业
查看>>
【DOM编程艺术】显示"缩略语列表"
查看>>
Java实现的断点续传功能
查看>>
用STL vector 来创建二维数组 zz
查看>>
关于Elastic Search (ES)集群的搭建
查看>>
Codeforces Round #116 (Div. 2, ACM-ICPC Rules) Letter(DP 枚举)
查看>>
IsolatedStorageSettings存储数据_____简单_____自定义(复杂)____数据
查看>>
《敏捷软件开发》第4章测试
查看>>
DOS windows 使用bat脚本获取 IP MAC 系统信息
查看>>