uoj311 【UNR #2】积劳成疾
【题解】
这题的期望dp好神奇啊(可能是我太菜了)
由于每个位置都完全一样,所以我们设$f_{i,j}$表示审了连续$i$个位置,最大值不超过$j$的期望。
那么只要考虑最大值为$j$的期望,其他从$f_{i,j-1}$加进来即可。
枚举最大值第一次出现的位置$p$(如果位置编号为$[1,i]$的话,因为位置都等价,所以可以这样做)
然后考虑$p$一定对于这些区间有贡献$[\max(1, p-K+1), \min(i-K+1, p)]$,那么这些区间的价值都是$w_j$,乘起来即可。
然后前后两半互斥,分别转移即可。
设区间长度为$len$,也就是上面那坨减一下+1。
所以$f_{i,j} = f_{i,j-1} + \sum_{p=1}^i f_{p-1,j-1} * w_j^{len} * f_{i-p, j}$
考虑初始状态,连续$i$个位置最大值不超过$j$,其中$i < k$,也就是还没有组成一个完整的区间,那么根据上面的转移方程,这个区间的值完全由自己决定,也就是$f_{i,j} = j^i$。
复杂度$O(n^3)$
# include <stdio.h>
# include <string.h>
# include <iostream>
# include <algorithm>
// # include <bits/stdc++.h> using namespace std; typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
const int M = + ;
const int mod = ; int n, K, w[M];
int f[M][M], c[M][M];
// 审了i套题,最大难度不超过j的方案数
// f[i, j] = f[i, j-1] + \sum_{x=1}^{i} f[x-1, j-1] * f[n-x, j] * w[x]^p inline int pwr(int a, int b) {
int ret = ;
while(b) {
if(b&) ret = 1ll * ret * a % mod;
a = 1ll * a * a % mod;
b >>= ;
}
return ret;
} int main() {
cin >> n >> K;
for (int i=; i<=n; ++i) {
scanf("%d", w+i);
c[i][] = ;
for (int j=; j<=n; ++j) c[i][j] = 1ll * c[i][j-] * w[i] % mod;
}
for (int i=; i<=n; ++i) f[][i] = ;
for (int i=; i<=n; ++i) {
for (int j=; j<=n; ++j) {
if(i < K) f[i][j] = pwr(j, i);
else {
f[i][j] = f[i][j-];
for (int x=; x<=i; ++x) {
f[i][j] = f[i][j] + 1ll * f[x-][j-] * f[i-x][j] % mod * c[j][min(i-K+, x) - max(x-K+, ) + ] % mod;
if(f[i][j] >= mod) f[i][j] -= mod;
}
}
}
}
cout << f[n][n]; return ;
}
uoj311 【UNR #2】积劳成疾的更多相关文章
- [UOJ UNR #2]积劳成疾
来自FallDream的博客,未经允许,请勿转载,谢谢. 传送门 区间最大值的题emmmm 想到构建笛卡尔树,这样自然就想到了一种dp f[i][j]表示大小为i的笛卡尔树,根的权值是j的答案. 转移 ...
- UOJ.311.[UNR#2]积劳成疾(DP)
UOJ 序列中的每个位置是等价的.直接令\(f[i][j]\)表示,\(i\)个数的序列,最大值不超过\(j\)的所有序列每个长为\(k\)的子区间最大值的乘积的和. 由\(j-1\)转移到\(j\) ...
- 【uoj#311】[UNR #2]积劳成疾 dp
题目描述 一个长度为 $n$ 的序列,每个数在 $[1,n]$ 之间.给出 $m$ ,求所有序列的 $\prod_{i=1}^{n-m+1}(\text{Max}_{j=i}^{j+m-1}a[j]) ...
- Noip前的大抱佛脚----赛前任务
赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...
- 【UOJ#311】【UNR #2】积劳成疾(动态规划)
[UOJ#311][UNR #2]积劳成疾(动态规划) UOJ Solution 考虑最大值分治解决问题.每次枚举最大值所在的位置,强制不能跨过最大值,左右此时不会影响,可以分开考虑. 那么设\(f[ ...
- UOJ #311「UNR #2」积劳成疾
需要锻炼$ DP$能力 UOJ #311 题意 等概率产生一个长度为$ n$且每个数在[1,n]间随机的数列 定义其价值为所有长度为$ k$的连续子数列的最大值的乘积 给定$ n,k$求所有合法数列的 ...
- A. 【UNR #2】积劳成疾
链接:http://uoj.ac/contest/40/problem/311 题解: 一道很好的期望题吧 用dp的老思路,枚举最大值将序列分割 想到这个就很简单了 状态f[i][j]表示前i个,最大 ...
- uoj#311. 【UNR #2】积劳成疾(期望dp)
传送门 果然\(dp\)题就没咱啥事儿了 设\(f_{i,j}\)为长度为\(i\)的区间,所有元素的值不超过\(j\)的总的疲劳值 如果\(j\)没有出现过,那么\(f_{i,j}=f_{i,j-1 ...
- [UOJ311]积劳成疾
题解 dp 似乎这个最大值不好设计状态啊== 但是可以发现这\(n\)个点每个点都是相同的 可以设计状态\(f_{i,j}\)表示一个长度为\(i\)的一段区间的最大值不会超过\(j\)的价值 那么转 ...
随机推荐
- 第5章 Linux 常用网络指令
网络参数设定使用的指令 手动/自动设定与启动/关闭 IP 参数: ifconfig, ifup, ifdown ifconfig :查询.设定网络卡与 IP 网域等相关参数:ifup, ifdown: ...
- 使用ssh公钥登陆
记录一下使用的具体命令,具体参考: Centos设置禁止密码登录而只使用密钥登录SSH方法 优先参考这个. ssh使用公钥授权不通过的问题解决 Xshell配置ssh免密码登录-密钥公钥(Publi ...
- PDO笔记
<?php/* * 查询操作主要是PDO::query().PDO::exec().PDO::prepare().PDO::query()主要是用于有记录结果返回的操作,特别是SELECT操作, ...
- artdialog对话框 三种样式 网址:http://www.planeart.cn/demo/artDialog/_doc/labs.html
摇头效果 类似与wordpress登录失败后登录框可爱的左右晃动效果 // 2011-07-17 更新 artDialog.fn.shake = function (){ var style = th ...
- 学习websocket-SignalR,MVC中使用SignalR打造酷炫实用的即时通讯
http://www.cnblogs.com/Leo_wl/p/4793284.html http://www.fangsi.net/archives/1144.html
- MVC4中control的增删改查
public class TestController : Controller { private LeaveEntities db = new LeaveEntities(); // // GET ...
- 包装类 integer 当做 list的参数时候 会出现无法删除成功的现象
- BZOJ 2157 旅行(树链剖分码农题)
写了5KB,1发AC... 题意:给出一颗树,支持5种操作. 1.修改某条边的权值.2.将u到v的经过的边的权值取负.3.求u到v的经过的边的权值总和.4.求u到v的经过的边的权值最大值.5.求u到v ...
- Django 2.0 学习(15):Web框架
Web框架的本质 对于学习Python的同学,相信对Flask.Django.Web.py等不会陌生,这些都是Python语言的web框架.那么问题来了,web服务器是什么?它和web框架有什么关系? ...
- [JLOI2011]飞行路线 最短路
题面 题面 题解 这题不是很难,因为删代价的次数不多,因此我们只需要将最短路中的状态加一维表示已经删了几次,再转移即可 #include<bits/stdc++.h> using name ...