题目描述

对于一个数列A[1..N],一种寻找最大值的方法是:依次枚举A[2]到A[N],如果A[i]比当前的A[1]值要大,那么就令A[1]=A[i],最后A[1]为所求最大值。假设所有数都在范围[1, K]内,按上面的步骤执行,有多少个长度N的数列满足A[1]被更新的次数恰好为P呢?

输入

本题有多组数据。输入第一行一个数T为数据组数,下面T行每行依次三个数N、K和P。

输出

对每组数据输出一行,为方案数模1000000007的值。

样例输入

3
4 3 2
2 3 1
3 4 1

样例输出

6
3
30


题解

dp

设 $f[i][j][k]$ 表示 $i$ 个数,更新次数为 $j$ ,最大值为 $k$ 的方案数。

那么考虑第 $i$ 个数是否对最大值产生更新来进行转移:

当不产生更新时,前面最大值为 $k$ ,第 $i$ 个数的取值范围为 $[1,k]$ ,因此 $f[i][j][k]=f[i-1][j][k]*k$ ;

当产生更新时,前面最大值取值范围为 $[1,k-1]$ ,第 $i$ 个数的取值为 $k$ ,因此 $f[i][j][k]=\sum\limits_{l=1}^{k-1}f[i-1][j-1][l]$ 。

因此使用前缀和 $sum[i][j][k]=\sum\limits_{l=1}^kf[i][j][l]$ 来优化dp转移,即可预处理出所有的dp值。

最后对于每个询问直接输出答案即可。

时间复杂度 $O(npk)$

#include <cstdio>
#define mod 1000000007
long long sum[155][155][310];
int main()
{
int i , j , k , T , x , y , z;
for(i = 1 ; i <= 300 ; i ++ ) sum[1][1][i] = i;
for(i = 2 ; i <= 150 ; i ++ )
for(j = 1 ; j <= 150 ; j ++ )
for(k = 1 ; k <= 300 ; k ++ )
sum[i][j][k] = (sum[i][j][k - 1] + sum[i - 1][j - 1][k - 1] + (sum[i - 1][j][k] - sum[i - 1][j][k - 1]) * k % mod + mod) % mod;
scanf("%d" , &T);
while(T -- ) scanf("%d%d%d" , &x , &y , &z) , printf("%lld\n" , sum[x][z + 1][y]);
return 0;
}

【bzoj2699】更新 dp的更多相关文章

  1. ZOJ 3632 Watermelon Full of Water (线段树 区间更新 + dp)

    题目大意: 让每天都能吃到西瓜. 最少须要花多少钱. 思路分析: dp[pos] 就表示  要让 前i天每天都有西瓜吃.最少须要花多少钱. 那么假设你买这个西瓜的话. 那么这个西瓜能吃的持续时间都要更 ...

  2. 持续更新——dp的一些技巧

    共菜鸡笔者看的--会慢慢更新,也请看到的大佬留意一眼,指出不足. 对于一些对部分点的二维\(dp\),状态从左上角继承而来时,对于一个点\((x,y)\),对它编号\(x*m+y\),按照这个顺序\( ...

  3. bzoj2699 更新

    题意 对于一个数列A[1..N],一种寻找最大值的方法是:依次枚举A[2]到A[N],如果A[i]比当前的A[1]值要大,那么就令A[1]=A[i],最后A[1]为所求最大值.假设所有数都在范围[1, ...

  4. DP专题(不定期更新)

    1.UVa 11584 Partitioning by Palindromes(字符串区间dp) 题意:给出一个字符串,划分为若干字串,保证每个字串都是回文串,同时划分数目最小. 思路:dp[i]表示 ...

  5. poj3311 Hie with the Pie (状态压缩dp,旅行商)

    Hie with the Pie Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 3160   Accepted: 1613 ...

  6. fzu2188 状压dp

    G - Simple String Problem Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%I64d & ...

  7. LightOJ1283 Shelving Books(DP)

    题目 Source http://www.lightoj.com/volume_showproblem.php?problem=1283 Description You are a librarian ...

  8. [poj3017] Cut the Sequence (DP + 单调队列优化 + 平衡树优化)

    DP + 单调队列优化 + 平衡树 好题 Description Given an integer sequence { an } of length N, you are to cut the se ...

  9. CodeForces #369 C. Coloring Trees DP

    题目链接:C. Coloring Trees 题意:给出n棵树的颜色,有些树被染了,有些没有.现在让你把没被染色的树染色.使得beauty = k.问,最少使用的颜料是多少.   K:连续的颜色为一组 ...

随机推荐

  1. 【转】odoo 10的企业微信发送程序介绍

    本文介绍的微信发送程序不是独立的模块,是某企业应用的一部分, 源码可在京津冀odoo技术交流群的群共享中下载.   [1]基本配置 在work.weixin.qq.com上注册一个企业后,会得到企业的 ...

  2. BZOJ3436_小K的农场_KEY

    题目传送门 差分约束基础,对于每种关系建不同的边,求是否有负环. code: /************************************************************ ...

  3. 食物链_KEY

    食物链 (eat.pas/c/cpp) [ 问题描述] 动物王国中有三类动物 A,B,C, 这三类动物的食物链构成了有趣的环形. A 吃 B, B 吃C, C 吃 A.现有 N 个动物, 以 1-N ...

  4. HDU 2242 考研路茫茫——空调教室

    考研路茫茫——空调教室 http://acm.hdu.edu.cn/showproblem.php?pid=2242 分析: 树形dp,删边. 代码: #include<cstdio> # ...

  5. redis 学习笔记三

    一.redis 复制 数据库复制指的是发生在不同数据库实例之间,单向的信息传播的行为,通常由被复制方和复制方组成,被复制方和复制方之间建立网络连接,复制方式通常为被复制方主动将数据发送到复制方,复制方 ...

  6. 负数取余/整除,Python和C语言的不同

    总结一句:Python中负数整除,是向负无穷取整,所以导致负数取余不对 在数学公式中,两种语言的表示算法都是一样的,都是: r=a-n*[a/n] 以上,r是余数,a是被除数,n是除数. 唯一不同点, ...

  7. 【system.array】使用说明

    对象:system.array 说明:提供一系列针对数组类型的操作 目录: 方法 返回 说明 system.array.join( array, separator ) [String]  将数组转换 ...

  8. 微信小程序 选项 、时间日期选择器

    wxml: <view class="section" > <picker bindchange="bindPickerChange" val ...

  9. Python3 小工具-僵尸扫描

    僵尸机的条件: 1.足够闲置,不与其他机器进行通讯 2.IPID必须是递增的,不然无法判断端口是否开放 本实验僵尸机选择的是Windows2003 from scapy.all import * im ...

  10. Python的top-level脚本为什么在磁盘上没有对应的字节码?

    在Python中,如果你使用python script.py这样的方式运行Python脚本,那么script.py就被称为top-level脚本.对于Python来说,这个脚本的字节码是不会写入到磁盘 ...