题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+离线】的更多相关文章

  1. 蓝桥杯 求最大值 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) ...

  2. 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的子序列 ...

  3. hrbust1841再就业(状态压缩dp)

    本人刚学压缩dp,只能对这些水题写题解 一方面对自己的理解有加深作用 另一方面希望和各位大牛交流交流..... 如果有对状态dp不太了解的童鞋可以参考入门知识:http://wenku.baidu.c ...

  4. 17996 Daily Cool Run (dp)

    时间限制:1000MS  内存限制:65535K 提交次数:0 通过次数:0 题型: 编程题   语言: 不限定 Description Daily Cool Run is a popular gam ...

  5. HDU 1520 树形dp裸题

    1.HDU 1520  Anniversary party 2.总结:第一道树形dp,有点纠结 题意:公司聚会,员工与直接上司不能同时来,求最大权值和 #include<iostream> ...

  6. 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 ...

  7. 树形DP +01背包(HDU 1011)

    题意:有n个房间,有n-1条道路连接着n个房间,每个房间都有若干个野怪和一定的能量值,有m个士兵从1房间入口进去,到达每个房间必须要留下若干士兵杀死所有的野怪,然后其他人继续走,(一个士兵可以杀死20 ...

  8. 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 ...

  9. DP总结 ——QPH

    常见优化 单调队列 形式 dp[i]=min{f(k)} dp[i]=max{f(k)} 要求 f(k)是关于k的函数 k的范围和i有关 转移方法 维护一个单调递增(减)的队列,可以在两头弹出元素,一 ...

随机推荐

  1. 火狐firefox、谷歌chrome等浏览器扩展、插件介绍

    火狐旧的插件扩展已经不可用,需要更新,这是本人安装的最新的插件 chrome插件 https://www.zhihu.com/question/68338297

  2. android 多进程 Binder AIDL Service

    本文參考http://blog.csdn.net/saintswordsman/article/details/5130947 android的多进程是通过Binder来实现的,一个类,继承了Bind ...

  3. 【手记】小心在where中使用NEWID()的大坑 【手记】解决启动SQL Server Management Studio 17时报Cannot find one of more components...的问题 【C#】组件分享:FormDragger窗体拖拽器 【手记】注意BinaryWriter写string的小坑——会在string前加上长度前缀length-prefixed

    [手记]小心在where中使用NEWID()的大坑 这个表达式: ABS(CHECKSUM(NEWID())) % 3 --把GUID弄成正整数,然后取模 是随机返回0.1.2这三个数,不可能返回其它 ...

  4. 【CODEFORCES】 C. Dreamoon and Strings

    C. Dreamoon and Strings time limit per test 1 second memory limit per test 256 megabytes input stand ...

  5. vue入门教程 (vueJS2.X)

    vue入门教程vueJS2.X 写在前面 看完此教程可以达到:能看懂并能修改简单的vue项目. 看的过程中,请把所有例子都放到html文件中跑一遍. Vue.js 是什么 Vue.js(读音 /vju ...

  6. Perl Compatible Regular Expressions

    http://www.pcre.org/ http://www.pcre.org/

  7. delphi的万能数据库操作

    好多人都抱怨delphi没有提供一个可以把任意数据放入数据库的控件,虽然说用代码实现也不难,但是有控件会更方便,这次我终于还是抽出空来做了这么个控件,以后就可以直接拖放了.它支持把任意数据类型写入数据 ...

  8. GET 与 POST 的理解

    1 HTTP请求      超文本传输协议(HTTP)的设计目的是保证客户机与服务器之间的通信.      HTTP 的工作方式是客户机与服务器之间的请求-应答协议.      比如,客户端(浏览器) ...

  9. caution

    做好需求更改的准备,提高代码的扩展性和可维护性:预留出修改bug和需求的时间:对需求理解透彻再开始写代码:代码不要写死,防止需求变动. 

  10. Go语言mgo

    本文重点介绍mgo使用,仅简单介绍mongodb. mongodb特性   mongdb简单介绍 注意: 上图已经告知我们mongo不支持事务,在开发项目应用时,想要保证数据的完整性请考虑关系型数据库 ...