最大值 (补档) dp+前缀和优化
来源:互联网 发布:json属性遍历 编辑:程序博客网 时间:2024/06/05 12:43
题目描述
找到一个数组的最大值的一种方法是从数组开头从前到后对数组进行扫描,令max=a[0](数组下表从0..N-1),如果a[i]>max,就更新max,这样就可以在O(N)的时间里找到一个数组的最大值。
这个问题是相当简单的,但是想到了另一个问题,如果一个包含N个元素的数组a里面的元素的值是在1…K之间的整数,存在多少个不同的数组a,进行了如上扫描之后,max恰好进行了p次更新?
下面是N = 4,K = 3,P = 2时所有情况
1) {1,1,2,3}
2) {1,2,1,3}
3) {1,2,2,3}
4) {1,2,3,1}
5) {1,2,3,2}
6) {1,2,3,3}
共有6种情况
由于答案可能很大,所以你仅仅需要把答案mod 10^9+7输出。
输入格式
输入文件findmax.in的第一行T,本题有T组数据。
接下来T行,每行三个整数,N,K,P
输出格式
输出文件findmax.out包括T行,每行一个答案。
分析
据——老伙计所说
f[i][j][k]表示前i项最大值为j且更新了k次的方案数,
代码
#include<iostream>#include<cstring>#include<cstdio>#include<cmath>#include<string>#include<algorithm>using namespace std;long long f[201][401][121];long long sum[201][401][121];int n,m,p;int main(){ freopen("findmax.in", "r", stdin); freopen("findmax.out", "w", stdout); int g=1000000007; n=100; m=300; p=100; for (int i=1;i<=m;i++) { f[1][i][0]=1;sum[1][i][0]=i; } for (int i=2;i<=n;i++) for (int j=1;j<=m;j++) { f[i][j][0]=((f[i-1][j][0]%g)*(j%g))%g; sum[i][j][0]=((f[i][j][0]%g)+(sum[i][j-1][0]%g))%g; for (int k=1;k<=p;k++) { f[i][j][k]=((sum[i-1][j-1][k-1]%g)+(f[i-1][j][k]%g)*j)%g; sum[i][j][k]=((f[i][j][k]%g)+(sum[i][j-1][k]%g))%g; } } int t; scanf("%d",&t); for (int i=1;i<=t;i++) { scanf("%d%d%d",&n,&m,&p); printf("%lld\n",sum[n][m][p]); } return 0;}
1 0
- 最大值 (补档) dp+前缀和优化
- LightOJ 1193 Dice (II)(前缀和优化dp)
- 【bzoj1096】【ZJOI2007】仓库建设(dp+前缀和+斜率优化)
- NKOJ 3792 分糖果(差值dp+前缀和优化)
- NKOJ 3860 分队问题(DP+前缀和优化)
- HDU 5550 dp + 前缀和优化
- CDOJ 1307 ABCDE dp, 前缀和优化
- poj3666(dp前缀优化)
- 2015.9.2组队赛 1006题(dp:前缀和优化,空间压缩)
- Codeforces 712D Memory and Scores(前缀和优化dp)
- 玲珑oj 1032 (容斥原理或前缀和优化dp)
- 1044: [HAOI2008]木棍分割 二分答案+DP+前缀和优化
- lightoj 1145 - Dice (I) 前缀和优化DP
- lightoj 1193 - Dice (II) 前缀和优化DP
- codeforces 708E——前缀和优化dp
- CF - 712D 差值dp + 前缀和优化
- codeforces712D Memory and Scores(前缀和优化dp)
- hihocoder1475 数组分拆【DP+前缀和优化】
- Transaction visibility / proxy / propagation REQUIRED and REQUIRES_NEW
- 使用 $.grep() 方法
- postman
- MapReduce详解及开发优化
- PCA的数学原理
- 最大值 (补档) dp+前缀和优化
- C++ 拷贝构造函数中浅拷贝与深拷贝
- jQuery中的Ajax
- 深入理解计算机系统总结
- javascript 内置对象 - History 对象 back forword go()
- C#实现UDP广播
- 基础练习 字母图形
- 理解java读写锁 ReadWriteLock
- ActiveMQ与Spring的整合之异步发送电子邮件