HDU 4055 计数dp + 排列组合
来源:互联网 发布:sm论坛 知乎 编辑:程序博客网 时间:2024/06/05 08:31
计数dp + 排列组合
题意:
有一列数字,当第i数字比前一个数字大的时候就可以生成一个字符I,否则就是D,现在给出字符串,求出数列有多少种排列方式,注意字符串?代表比前一个数字大小都可以。
思路:
此类题可以从当前第i数字是哪一个考虑。
定义:
那么当第i个字符串是‘I’,
是”D”的时候:
这里需要注意的点是可以优化,为什么,因为在计算的时候,是递推性质的,可以利用到前一个结果,具体看代码。
#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;const int maxn = 1e3+10;const int mod = 1000000007;typedef long long LL;char s[maxn];LL dp[maxn][maxn];int main(){// freopen("in.txt","r",stdin); while(scanf("%s",s+1) != EOF) { int len = strlen(s+1)+1; memset(dp,0,sizeof(dp)); dp[1][1] = 1; for(int i = 2;i <= len; i++) { if(s[i-1] == 'I') { for(int j = 2;j <= i; j++) { dp[i][j] = (dp[i][j-1] + dp[i-1][j-1])%mod; } } else if(s[i-1] == 'D') { for(int j = i-1;j >= 1; j--) { dp[i][j] = (dp[i-1][j] + dp[i][j+1])%mod; } } else { LL sum = 0; for(int j = 1;j < i; j++) { sum = (sum + dp[i-1][j])%mod; } for(int j = 1;j <= i; j++) { dp[i][j] = sum; } } } LL ans = 0; for(int i = 1;i <= len; i++) { ans = (ans + dp[len][i])%mod; } printf("%I64d\n",ans); } return 0;}
阅读全文
0 0
- HDU 4055 计数dp + 排列组合
- hdu 5155(DP+排列组合)
- 【HDU】 4832 Chess 排列组合 DP
- hdu 5151区间dp+排列组合
- 计数dp hdu 4055 Number String
- HDU 4055 Number String(计数dp)
- hdu 5136(dp计数)
- HDU - 5136(计数dp)
- HDU 5401(计数dp)
- HDU - 5116(计数dp)
- hdu 5800 计数dp
- HDU 6078 (计数DP)
- HDU 1421 DP计数
- HDU 1799 循环多少次?(排列组合,dp)
- 排列组合(二) - HDU 1436 dp
- HDU--5396(区间dp+排列组合)
- HDU 5396 Expression(区间DP,排列组合)
- hdu 5719 Arrange (dp 递推 排列组合)
- linux gcc-error: dereferencing pointer to incomplete type
- ES6 第三章 关于“字符串” 不得不说的扩展~
- Cesium原理篇:1最长的一帧之渲染调度
- Xml 转换对象以及对象转换xml应用XStream
- opencv基础知识之cvFindContours
- HDU 4055 计数dp + 排列组合
- dorado7多选模式会对应后台接口参数
- 微信上传头像
- VMware Workstation 的安装和使用(安装linux系统)
- Spark性能优化:shuffle调优
- 贪心算法(动态规划问题)
- Merge k Sorted Lists
- hibernate懒加载用法和好处
- 学习C++:实践者的方法(Beta1)