[ZPG TEST 118] 最大值【dp+离线】
题4 最大值(findmax)
【题目描述】
找到一个数组的最大值的一种方法是从数组开头从前到后对数组进行扫描,令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行,每行一个答案。
【样例输入】
3
4 3 2
2 3 1
3 4 1
【样例输出】
6
3
30
【数据规模】
30%数据
T=1
1 <= n <= 10
1 <= K <= 2
0 <= P < n
60%数据
T=1
1 <= n <= 50
1 <= K <= 10
0 <= P < n
100%数据
1 <= T <= 100
1 <= n <= 100
1 <= K <= 300
0 <= P < n
我说什么鬼,100 * 100 * 300 * 100还能不炸?原来离线了。。。
令f(i, j, k)表示前i个数,最大值为j,更新了k次的方案数,则
f(i, j, k) = f(i - 1, j, k) * j + f(i - 1, 1, k - 1) + f(i - 1, 2, k - 1) + ... + f(i - 1, j - 1, k - 1)
用s(i, j, k)表示f(i, 1, k) + f(i, 2, k) + ... + f(i, j, k),则
f(i, j, k) = f(i - 1, j, k) * j + s(i - 1, j - 1, k - 1),
其中f(i - 1, j, k) * j表示最大值不变,则第i位可以是闭区间[1, j]之间的数,s(i - 1, j - 1, k - 1)表示最大值更新为j。
#include <cstdio>
#include <cstring> const int maxn = 105, mod = 1000000007; int T, n, max_k, p;
long long f[maxn][305][maxn], s[maxn][305][maxn]; int main(void) {
freopen("findmax.in", "r", stdin);
freopen("findmax.out", "w", stdout);
scanf("%d", &T);
for (int j = 1; j < 301; ++j) {
f[1][j][0] = 1;
s[1][j][0] = j;
}
for (int i = 2; i < 101; ++i) {
for (int j = 1; j < 301; ++j) {
f[i][j][0] = (f[i - 1][j][0] * j) % mod;
s[i][j][0] = (s[i][j - 1][0] + f[i][j][0]) % mod;
for (int k = 0; k < 101; ++k) {
f[i][j][k] = (f[i - 1][j][k] * j + s[i - 1][j - 1][k - 1]) % mod;
s[i][j][k] = (s[i][j - 1][k] + f[i][j][k]) % mod;
}
}
}
while (T--) {
scanf("%d%d%d", &n, &max_k, &p);
printf("%d\n", s[n][max_k][p]);
}
return 0;
}
[ZPG TEST 118] 最大值【dp+离线】的更多相关文章
- 蓝桥杯 求最大值 dp
这题很暴力的一个DP,d[i][j]表示前i个数对选择一些Ai的和为j的最大Bi和. 状态转移方程: dp[i][j]=max(dp[i][j],dp[i-1][j-sc[i].a]+sc[i].b) ...
- 959F - Mahmoud and Ehab and yet another xor task xor+dp(递推形)+离线
959F - Mahmoud and Ehab and yet another xor task xor+dp+离线 题意 给出 n个值和q个询问,询问l,x,表示前l个数字子序列的异或和为x的子序列 ...
- hrbust1841再就业(状态压缩dp)
本人刚学压缩dp,只能对这些水题写题解 一方面对自己的理解有加深作用 另一方面希望和各位大牛交流交流..... 如果有对状态dp不太了解的童鞋可以参考入门知识:http://wenku.baidu.c ...
- 17996 Daily Cool Run (dp)
时间限制:1000MS 内存限制:65535K 提交次数:0 通过次数:0 题型: 编程题 语言: 不限定 Description Daily Cool Run is a popular gam ...
- HDU 1520 树形dp裸题
1.HDU 1520 Anniversary party 2.总结:第一道树形dp,有点纠结 题意:公司聚会,员工与直接上司不能同时来,求最大权值和 #include<iostream> ...
- hdu 1561 The more, The Better(树形dp,基础)
The more, The Better Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- 树形DP +01背包(HDU 1011)
题意:有n个房间,有n-1条道路连接着n个房间,每个房间都有若干个野怪和一定的能量值,有m个士兵从1房间入口进去,到达每个房间必须要留下若干士兵杀死所有的野怪,然后其他人继续走,(一个士兵可以杀死20 ...
- HDU 1024:Max Sum Plus Plus(DP)
http://acm.hdu.edu.cn/showproblem.php?pid=1024 Max Sum Plus Plus Problem Description Now I think you ...
- DP总结 ——QPH
常见优化 单调队列 形式 dp[i]=min{f(k)} dp[i]=max{f(k)} 要求 f(k)是关于k的函数 k的范围和i有关 转移方法 维护一个单调递增(减)的队列,可以在两头弹出元素,一 ...
随机推荐
- Jupyter Notebook 基本使用
Jupyter 官网 IPython Interactive Computing IPython Notebook使用浏览器作为界面,向后台的IPython服务器发送请求,并显示结果.在浏览器的界面中 ...
- 【原创】PHP扩展开发入门
PHP扩展开发入门 作者:wf (360电商技术组) 在我们编写自己的第一个php扩展之前,先了解一下php的总体架构和执行机制. php的架构如图1所看到的. 当中一个重要的就是SAPI(serve ...
- Swift简单介绍 教程
Swift是什么? Swift是苹果于WWDC 2014公布的编程语言.这里引用The Swift Programming Language的原话: Swift is a new programmi ...
- UVA 10288 - Coupons(概率递推)
UVA 10288 - Coupons option=com_onlinejudge&Itemid=8&page=show_problem&category=482&p ...
- 海思HI3516A开发板顺利上线
有图有真相.
- Visual Studio Code 常用插件
这里记录在Visual Studio Code中,我经常用到的插件. C#这个就不必说了,想用VIsual Studio Code调试和编辑C#代码,必须要装这个插件.东西还好,就是每次安装和更新插件 ...
- Cocos从入门到精通--《创建第一个项目:HelloWorld》
上节课我们解说了cocos2-x v3.7版本号的下载安装,也展示了使用CocosStudio编译不同平台运行程序的方法,大家是不是对新版本号的Cocos引擎充满期待?今天我们就创建一个project ...
- Oracle修改序列(Sequence)起始值问题
Oracle 序列(Sequence)主要用于生成流水号,在应用中经常会用到,特别是作为ID值,拿来做表主键使用较多. 但是,有时需要修改序列初始值(START WITH)时,有同仁使用这个语句来修改 ...
- 在Eclipse中tomcat 内存配置
修改1: 在Eclipse中下面Servers双击Tomcat Server... 然后点击General InformAtion 下的Open launch configuration: 会弹出Ed ...
- 利用chrome调试手机网页
1.pc端安装最新的chrome 2.手机端安装最新的chrome ( Android机 )ms不需要 3.USB连接线 4.打开电脑的chrome 在地址栏输入 chrome://inspect