hdu 4055 Number String【递推】
来源:互联网 发布:斗鱼主播都用什么软件 编辑:程序博客网 时间:2024/06/05 16:28
题目
http://acm.hdu.edu.cn/showproblem.php?pid=4055
题意
给一个n,求n个高矮不同的人排成一排使得高、矮依次排列的种数。
分析
定义dp[i][j]表示在这个排列中第i个数字以j结尾的,满足条件的子排列有多少个。
如果第i个字符是‘I’,那么明显可以得到dp[i][j]=dp[i-1][j-1]+dp[i-1][j-2]+……+dp[i-1][1]。
如果第i个字符是‘D’,那么如何得到由前面的状态dp[i][j]呢?有这个一个有趣的性质,比如对于一个排列{1,3,2},现在我们在递推得到dp[4][2],也就是要把2添加到这个排列的最后面,现在把当前排列即{1,3,2}中大于等于2的全部加上一得到{1,4,3},这样是仍然不会改变题目给出的关系的,然后我们再把2添加到最后,{1,4,3,2},就可以得到dp[4][2]了,即dp[i][j]={dp[i-1][i-1]+dp[i-1][i-2]+……+dp[i-1][j]}。
代码
#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>#include <string>#include <vector>#include <queue>#include <map>#include <set>#include <cmath>using namespace std;typedef long long LL;typedef pair<int,int> pii;const int N=1e3+9;const int mod=1e9+7;char s[N];LL sum[N][N],f[N][N];int main(){ while(~scanf("%s",s+2)){ int n=strlen(s+2); f[1][1]=sum[1][1]=1; for(int i=2;i<=n+1;i++){ for(int j=1;j<=i;j++){ if(s[i]=='I')f[i][j]=sum[i-1][j-1]; else if(s[i]=='D')f[i][j]=(sum[i-1][i-1]-sum[i-1][j-1]+mod)%mod; else f[i][j]=sum[i-1][i-1]; sum[i][j]=(sum[i][j-1]+f[i][j])%mod; } } printf("%lld\n", sum[n+1][n+1]); } return 0;}
阅读全文
0 0
- hdu 4055 Number String【递推】
- HDU 4055 Number String【DP递推+递推优化】【好题】
- hdu 4055 Number String
- hdu 4055Number string
- Hdu 4055 Number String
- hdu 4055 Number String
- HDU 4055 Number String
- hdu 4055 Number String
- HDU 4055 Number String
- HDU-4055 Number String
- HDU 4055 Number String
- HDU 4055 Number String
- hdu 4055 Number String
- HDU 2070 Fibbonacci Number【递推】
- [DP]HDU 4055 Number String
- HDU 4055 Number String dp
- HDU 4055 Number String(DP)
- hdu 1708 Fibonacci String (递推)
- git 库中有库的问题
- DeepLearning_SparseAutoencoder
- selenium 小结
- 1017
- ArrayList
- hdu 4055 Number String【递推】
- Cookie Choice II ZOJ
- java子父类继承时方法重写与属性覆盖
- Java/Android 设计模式系列(12)--组合模式
- C#-WinForm班级下拉框数据绑定
- Html(快捷键!+Tab)
- java定位选择店铺
- UVA11082MatrixDecompressing
- 半年总结-择善而从