【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 ...
随机推荐
- Docker系列之CentOS7安装Docker(一)
0.前言 整体架构目录:ASP.NET Core分布式项目实战-目录 一.瞎扯淡(只讲有用的) 感兴趣的同学可以上网搜索一下docker具体的介绍.我这边主要介绍偏实战的内容,不喜勿喷,有问题也请指出 ...
- express的web server设置流程
对于express的设置,一直是拿来就用,只知其然,今天查了一下文档,记录详细过程如下. 1.实现基本常用功能需要的模块path 用来处理路径字符串拼接,设置模板路径和静态资源路径时使用cookie- ...
- Cisco Packet Tracer中两台电脑通信设置
Cisco Packet Tracer是网络初学者仿真模拟网络环境的必备工具.今天我们来模拟下两台电脑之间的通信. Cisco Packet Tracer版本6.2.0 一.添加设备 1.这里添加一个 ...
- Bitcoin Core P2P网络层
目录 数据结构 节点发现和节点连接 地址管理 节点发现 节点连接 插口(Sockets)和消息 Socket线程 (net.cpp) 消息线程 ProcessMessages (net_process ...
- 工程能力之C4模型
概述 刚在InfoQ上看到一篇介绍C4Model的文章,觉得这个模型设计的很赞,很有指导意义,做个简单的记录. Why,为什么需要架构图? ThoughtWorks中国 文章中有几句话我觉得很有道理, ...
- mysql 伪列
select @rownum:=@rownum+1 AS rownum,b.* from (SELECT @rownum:=0) r ,goods_description_new b
- Beta阶段版本控制报告
版本控制代码及文档要求 在coding.net版本控制; 公开项目,教师.专家.其他同学可以不注册源代码.在此公布git地址. 报告beta阶段2周中,项目的版本控制情况,不包括未在coding.ne ...
- 2-Nineth Scrum Meeting20151209
任务分配 闫昊: 今日完成:商讨如何迁移ios代码到android平台. 明日任务:请假.(编译) 唐彬: 今日完成:商讨如何迁移ios代码到android平台. 明日任务:请假.(编译) 史烨轩: ...
- 自学iOS-获取当前时间
NSDate * senddate=[NSDate date]; NSDateFormatter *dateformatter=[[NSDateFormatter alloc] init]; [dat ...
- 深入理解mybatis
MyBatis是目前非常流行的ORM框架,它的功能很强大,然而其实现却比较简单.优雅.本文主要讲述MyBatis的架构设计思路,并且讨论MyBatis的几个核心部件,然后结合一个select查询实例, ...