[HZNUOJ1524]排队买票(DP)
2016-03-18 19:31
260 查看
题目链接:http://acm.hznu.edu.cn/JudgeOnline/problem.php?id=1524
简单分析后可以知道每一个手持两元的小朋友前面,售票员手里至少有一个一元。
假设dp(i, j)表示当有i个1元和j个2元的时候的排队方法(不重复),那么有:
dp(i, j)=∑k[0, j]dp(i-1, k), (i >= j)
题干讲n个人和k个人内部不同位置也算新的排列方法。那么最后要乘上A(k,k)*A(n,n)
简单分析后可以知道每一个手持两元的小朋友前面,售票员手里至少有一个一元。
假设dp(i, j)表示当有i个1元和j个2元的时候的排队方法(不重复),那么有:
dp(i, j)=∑k[0, j]dp(i-1, k), (i >= j)
题干讲n个人和k个人内部不同位置也算新的排列方法。那么最后要乘上A(k,k)*A(n,n)
#include <algorithm> #include <iostream> #include <iomanip> #include <cstring> #include <climits> #include <complex> #include <fstream> #include <cassert> #include <cstdio> #include <bitset> #include <vector> #include <deque> #include <queue> #include <stack> #include <ctime> #include <set> #include <map> #include <cmath> using namespace std; const int maxn = 15; int n, m, k; int dp[maxn][maxn]; int main() { // freopen("in", "r", stdin); scanf("%d %d %d", &m, &n, &k); memset(dp, 0, sizeof(dp)); int ak = 1, an = 1; for(int i = 1; i <= k; i++) ak *= i; for(int i = 1; i <= n; i++) an *= i; dp[1][0] = 1; dp[1][1] = 1; for(int i = 2; i <= n; i++) { for(int j = 0; j <= i; j++) { for(int k = 0; k <= j; k++) { dp[i][j] += dp[i-1][k]; } } } printf("%d\n", dp [k]*ak*an); return 0; }
相关文章推荐
- (8)Python爬虫——爬取豆瓣影评数据
- 第二篇学习笔记
- 简单登陆界面的编辑
- 思维简图(Thinking of)
- Find the Spy
- 微信开发解决if...else..的臃肿
- JAVA多线程学习---(一)
- iOS设置tabbar的显示之 imageWithRenderingMode:
- 关于成为架构师的几个思考?
- 计算流图中的前必经节点
- 播放video失败之后,在surfaceview没有销毁的状态下再播下一个video出错
- 查看过去24小时的目录及对应子目录大小脚本
- HDU1056 Tree Cutting(最小点覆盖)
- fuel8.0的问题
- android动画详解二 属性动画原理
- 代码测试:java反射中getXXX和getDeclaredXXX的区别
- HTML、CSS、JavaScript学习总结
- TCP/IP、UDP、Http、Socket的区别
- td 属性 noWrap 防止折行、撑开(及其它文字换行问题)
- SSM框架——使用MyBatis Generator自动创建代码