题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. uva558 Wormholes SPFA 求是否存在负环

    J - Wormholes Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Stat ...

  2. VB6 如何添加自定义函数 模块 把代码放到一个模块中

    1 工程-添加模块,在右侧工程视图中可以发现多了一个Module1   2 比如我在这个模块中自定义两个函数,分别为写入和读取INI的函数   3 则在主程序中已经可以直接调用  

  3. Matplotlib绘图基础

    import matplotlib.pyplot as plt import numpy as np #绘图流程 x=np.linspace(-1,1,100) y=x**2 plt.plot(x,y ...

  4. The type java.lang.reflect.AnnotatedElement cannot be resolved. It is indirectly referenced from required .class files

    我这个错误发生于导入项目的时候..我发现主要是jdk版本的问题.切换一下jdk.直接红叉消失就可以了.....jdk版本一致性还是很重要的

  5. 导入别人的Android项目,提示 /Libs/gen already exists but is not a source folder. Convert to a source folder or rename it

    解决方法: 遇到这个问题的解决方法: 1. 右键点击工程,选择 "Properties" 2. 选择左边的 "Java Build Path" 3. 打开 &q ...

  6. What Is the Linux Lokkit Utility? https://www.lifewire.com/what-is-lokkit-2192255

    lokkit: The Lokkit utility attempts to provide firewalling for the average Linux end user. Instead o ...

  7. 生成器 减少代码行数 map reduce

    map reduce l = [[2, 3], [2, 3, 4]] ll = [2, 3, 4] l = [int(i) for i in set(','.join([','.join([str(i ...

  8. Flame Graphs

    http://www.brendangregg.com/flamegraphs.html Flame graphs are a visualization of profiled software, ...

  9. CMMI Institute Conference 2014中国大会

    我在大会上做SPD(Strategic Policy Deployment战略部署策略)的演讲,和来自各个公司的高管进行了热烈的讨论.获得好评. 有兴趣的朋友能够点击下面链接:Stratehttp:/ ...

  10. vim插件:显示树形目录插件NERDTree安装 和 使用【转】

    本文转载自:https://my.oschina.net/VASKS/blog/388907 下载和配置 NERDTree插件的官方地址如下,可以从这里获取最新的版本 https://github.c ...