【uoj#311】[UNR #2]积劳成疾 dp
一个长度为 $n$ 的不确定序列,每个数在 $[1,n]$ 之间。给出 $m$ ,求所有序列的 $\prod_{i=1}^{n-m+1}w[\text{Max}_{j=i}^{j+m-1}a[j]]$ 的总和,即对所有序列求每个长度为 $m$ 的子区间的最大值乘积之和。答案对 $998244353$ 取模。
$m\le n\le 400$ 。
题解
dp
设 $f[i][j]$ 表示长度为 $i$ 的序列,每个数都在 $[1,j]$ 之间的所有序列每个长度为 $m$ 的子区间最大值乘积之和。
那么如果这个序列没有出现过 $j$ ,则有 $f[i][j]=f[i][j-1]$ 。
如果这个序列出现过 $j$ ,那么考虑枚举 $j$ 从左到右第一个出现的位置 $k$ ,所有包含 $k$ 的区间最大值都为 $j$ 。令包含 $k$ 的长度为 $m$ 的子区间个数为 $c$ ,则 $k$ 的贡献为 $v[j]^c$ 。左面没有出现过 $j$ ,贡献为 $f[k-1][j-1]$ ;右面可能还会出现 $j$ ,贡献为 $f[i-k][j]$ 。
故总的dp方程为:$f[i][j]=\sum\limits_{k=1}^iv[j]^{c[i][k]}·f[k-1][j-1]·f[i-k][j]$ ,其中 $c[i][k]$ 表示长度为 $i$ 的区间的所有长度为 $m$ 的子区间中包含位置 $k$ 的个数,可以预处理出来也可以分类讨论。
答案为 $f[n][n]$ 。
注意边界问题:当区间长度 $i$ 小于 $m$ 时,贡献就是 $序列个数\times 1=j^i$ 。
预处理幂次,时间复杂度 $O(n^3)$
#include <cstdio>
#include <algorithm>
#define N 410
#define mod 998244353
using namespace std;
typedef long long ll;
ll w[N] , p[N][N] , c[N][N] , f[N][N];
int main()
{
int n , m , i , j , k;
scanf("%d%d" , &n , &m);
for(i = 1 ; i <= n ; i ++ )
{
scanf("%lld" , &w[i]) , p[i][0] = 1;
for(j = 1 ; j <= n ; j ++ )
p[i][j] = p[i][j - 1] * w[i] % mod;
}
for(i = 0 ; i <= n ; i ++ ) f[0][i] = 1;
for(i = 1 ; i < m ; i ++ )
for(j = 0 ; j <= n ; j ++ )
f[i][j] = f[i - 1][j] * j % mod;
for(i = m ; i <= n ; i ++ )
for(j = 1 ; j <= i - m + 1 ; j ++ )
for(k = j ; k < j + m ; k ++ )
c[i][k] ++ ;
for(i = m ; i <= n ; i ++ )
{
for(j = 1 ; j <= n ; j ++ )
{
f[i][j] = f[i][j - 1];
for(k = 1 ; k <= i ; k ++ )
f[i][j] = (f[i][j] + f[k - 1][j - 1] * f[i - k][j] % mod * p[j][c[i][k]]) % mod;
}
}
printf("%lld\n" , f[n][n]);
return 0;
}
【uoj#311】[UNR #2]积劳成疾 dp的更多相关文章
- UOJ.311.[UNR#2]积劳成疾(DP)
UOJ 序列中的每个位置是等价的.直接令\(f[i][j]\)表示,\(i\)个数的序列,最大值不超过\(j\)的所有序列每个长为\(k\)的子区间最大值的乘积的和. 由\(j-1\)转移到\(j\) ...
- 【UOJ#311】【UNR #2】积劳成疾(动态规划)
[UOJ#311][UNR #2]积劳成疾(动态规划) UOJ Solution 考虑最大值分治解决问题.每次枚举最大值所在的位置,强制不能跨过最大值,左右此时不会影响,可以分开考虑. 那么设\(f[ ...
- UOJ #311「UNR #2」积劳成疾
需要锻炼$ DP$能力 UOJ #311 题意 等概率产生一个长度为$ n$且每个数在[1,n]间随机的数列 定义其价值为所有长度为$ k$的连续子数列的最大值的乘积 给定$ n,k$求所有合法数列的 ...
- uoj#311. 【UNR #2】积劳成疾(期望dp)
传送门 果然\(dp\)题就没咱啥事儿了 设\(f_{i,j}\)为长度为\(i\)的区间,所有元素的值不超过\(j\)的总的疲劳值 如果\(j\)没有出现过,那么\(f_{i,j}=f_{i,j-1 ...
- uoj#311 【UNR #2】积劳成疾
题目 考虑直接顺着从\(1\)填数填到\(n\)发现这是在胡扯 所以考虑一些奇诡的东西,譬如最后的答案长什么样子 显然某一种方案的贡献是一个\(\prod_{i=1}^nw_i^{t_i}\)状物,\ ...
- [UOJ UNR #2]积劳成疾
来自FallDream的博客,未经允许,请勿转载,谢谢. 传送门 区间最大值的题emmmm 想到构建笛卡尔树,这样自然就想到了一种dp f[i][j]表示大小为i的笛卡尔树,根的权值是j的答案. 转移 ...
- uoj【UNR #3】To Do Tree 【贪心】
题目链接 uojUNR3B 题解 如果不输出方案,是有一个经典的三分做法的 但是要输出方案也是可以贪心的 设\(d[i]\)为\(i\)节点到最深的儿子的距离 贪心选择\(d[i]\)大的即可 #in ...
- UOJ.386.[UNR #3]鸽子固定器(贪心 链表)
题目链接 \(Description\) 选最多\(m\)个物品,使得它们的\((\sum vi)^{dv}-(s_{max}-s_{min})^{du}\)最大. \(Solution\) 先把物品 ...
- Uoj 441 保卫王国
Uoj 441 保卫王国 动态 \(dp\) .今天才来写这个题. 设 \(f[u][0/1]\) 表示子树 \(u\) 中不选/选 \(u\) 时的最小权值和,显然有:\(f[u][0]=\sum ...
随机推荐
- 菜鸟vimer成长记——第4.2章、编程插件
简介 这部分的插件是与编程相关的插件.主要涉及两大块:所有编程语言通用的插件,以及各个语言独有的插件.插件的数量和合理性,这可能是一个不断累积和修正的过程. 个人感觉,现在比较适合sh,html,ma ...
- 用 Python 带你看《我不是药神》
我们都是小人物,我们都得了同一种病,我们都穷.——<我不是药神> 我不是程序员 我就是想求求你们,别动不动就拿篇10W+的文章来吓唬人好吗?说点有用的东西好吗?我们需要精神粮食不需要腐蚀精 ...
- Web层框架对网站中所有异常的统一处理
一个网站的异常信息作为专业的人士,是不会轻易暴露给用户的,因为那样狠不安全,显得你漏是一回事,只要还是考虑到网站的数据安全问题,下面给大家分享一下一些常见的web层框架是如何处理统一的异常. 之前都是 ...
- python 模块之 bisect
python一个有趣的模块,bisect,感觉挺有趣,怎么有趣呢,下面来给你道来. 我们先生成一个list data=[4,8,7,1] data.sort() 打印这个list [1,4,7,8] ...
- 使用web api开发微信公众号,调用图灵机器人接口(一)
此文将分两篇讲解,主要分为以下几步 签名校验; 首次提交验证申请; 接收消息; 被动响应消息(返回XML); 映射图灵消息及微信消息; 其实图灵机器人搭载微信公众号很简单,只需要把图灵的地址配到公众后 ...
- .NET:关于数据模型、领域模型和视图模型的一些思考
背景 数据模型.领域模型和视图模型是“模型”的三种角色,一些架构用一种类型表示这三种角色,如:传统三层架构.也有一些架构用两种类型表示这三种角色,如:结合ORM的领域驱动架构.非常少见的场景是用三种类 ...
- c语言数字图像处理(八):噪声模型及均值滤波器
图像退化/复原过程模型 高斯噪声 PDF(概率密度函数) 生成高斯随机数序列 算法可参考<http://www.doc.ic.ac.uk/~wl/papers/07/csur07dt.pdf&g ...
- numpy技巧
矩阵旋转: mat_array = np.array([[1,2],[4,3]]) rotate_90 = np.zeros((2,2), np.uint8) rotate_180 = np.zero ...
- Android工程导入Unity3D(避坑版)
最近与各种牛逼的项目管理软件打交道,比如SourceTree,要看英文版的才看得懂,中文反而不会用!... 这篇博客适合没怎么接触过安卓的小伙伴们,网上也有很多相关的教程,但是大多都没有具体的操作或则 ...
- java后端面试题汇总
转载链接:https://www.nowcoder.com/discuss/90776?type=0&order=0&pos=23&page=0 基础篇 数据结构与算法 线性表 ...