JZOJ8.13最大值
来源:互联网 发布:正规淘宝客服兼职平台 编辑:程序博客网 时间:2024/05/22 21:52
题目:
找到一个数组的最大值的一种方法是从数组开头从前到后对数组进行扫描,令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)输出。
分析:
这道题目一开始是没啥子思路,三十分想去水然而失败了。后来听讲是DP,数组f[i,j,k]表示i位之前最大的数为j,并且已经更新了k次的方案数。那么f[i,j,k]=f[i-1,temp,k-1]+f[i-1,j,k]*j,其中temp为所有小于j的数字。
附上代码:
const
p=1000000007;
maxn=500;
var
a,num:array [0..maxn,0..maxn] of int64;
time,n,m,temp:longint;
function min(a,b:longint):longint;
begin
if a<b then
exit(a);
exit(b);
end;
procedure reset;
var
i:longint;
begin
for i:=1 to m do
begin
a[i,0]:=1;
num[i,0]:=i;
end;
end;
procedure init;
var
i,j,k,z:longint;
ans:int64;
begin
readln(time);
for z:=1 to time do
begin
fillchar(a,sizeof(a),0);
fillchar(num,sizeof(num),0);
readln(n,m,temp);
reset;
for i:=2 to n do
for k:=min(i-1,temp) downto 0 do
for j:=1 to m do
begin
a[j,k]:=(a[j,k]*j) mod p;
if k>0 then
a[j,k]:=(a[j,k]+num[j-1,k-1]) mod p;
num[j,k]:=num[j-1,k]+a[j,k];
end;
ans:=0;
for i:=1 to m do
ans:=(ans+a[i,temp]) mod p;
writeln(ans);
end;
end;
begin
init;
end.
- JZOJ8.13最大值
- JZOJ8.13最大正方形
- JZOJ8.13数字游戏
- JZOJ8.14(C组)射命丸文
- 最大值
- 最大值
- 最大值
- 最大值
- 最大值
- 最大值
- 最大值
- 最大值
- 最大值
- 最大值
- 最大值
- 最大值
- 最大值
- 最大值
- 策略模式、代理模式
- jsp内置对象总结
- nginx学习笔记
- 独立按键和矩阵键盘
- Java: Annotation 浅析(二) 自定义注解处理器
- JZOJ8.13最大值
- 八皇后问题优化版:DFS剪剪剪
- poj 1416 Shredding Company (应该是用dfs吧,但是想了一下午不知道怎么递归来做,所以暴力做了)
- 基础篇-Service解析
- 用窗口程序做Java socket编写聊天程序
- 字符矩阵中是否存在环
- HDU.1242 Rescue【DFS】【8月13】
- 【JZOJ 4687】奇袭
- 单例模式(singleton),工厂方法模式(factory),门面模式(facade)