题目描述

一个长度为 $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的更多相关文章

  1. UOJ.311.[UNR#2]积劳成疾(DP)

    UOJ 序列中的每个位置是等价的.直接令\(f[i][j]\)表示,\(i\)个数的序列,最大值不超过\(j\)的所有序列每个长为\(k\)的子区间最大值的乘积的和. 由\(j-1\)转移到\(j\) ...

  2. 【UOJ#311】【UNR #2】积劳成疾(动态规划)

    [UOJ#311][UNR #2]积劳成疾(动态规划) UOJ Solution 考虑最大值分治解决问题.每次枚举最大值所在的位置,强制不能跨过最大值,左右此时不会影响,可以分开考虑. 那么设\(f[ ...

  3. UOJ #311「UNR #2」积劳成疾

    需要锻炼$ DP$能力 UOJ #311 题意 等概率产生一个长度为$ n$且每个数在[1,n]间随机的数列 定义其价值为所有长度为$ k$的连续子数列的最大值的乘积 给定$ n,k$求所有合法数列的 ...

  4. uoj#311. 【UNR #2】积劳成疾(期望dp)

    传送门 果然\(dp\)题就没咱啥事儿了 设\(f_{i,j}\)为长度为\(i\)的区间,所有元素的值不超过\(j\)的总的疲劳值 如果\(j\)没有出现过,那么\(f_{i,j}=f_{i,j-1 ...

  5. uoj#311 【UNR #2】积劳成疾

    题目 考虑直接顺着从\(1\)填数填到\(n\)发现这是在胡扯 所以考虑一些奇诡的东西,譬如最后的答案长什么样子 显然某一种方案的贡献是一个\(\prod_{i=1}^nw_i^{t_i}\)状物,\ ...

  6. [UOJ UNR #2]积劳成疾

    来自FallDream的博客,未经允许,请勿转载,谢谢. 传送门 区间最大值的题emmmm 想到构建笛卡尔树,这样自然就想到了一种dp f[i][j]表示大小为i的笛卡尔树,根的权值是j的答案. 转移 ...

  7. uoj【UNR #3】To Do Tree 【贪心】

    题目链接 uojUNR3B 题解 如果不输出方案,是有一个经典的三分做法的 但是要输出方案也是可以贪心的 设\(d[i]\)为\(i\)节点到最深的儿子的距离 贪心选择\(d[i]\)大的即可 #in ...

  8. UOJ.386.[UNR #3]鸽子固定器(贪心 链表)

    题目链接 \(Description\) 选最多\(m\)个物品,使得它们的\((\sum vi)^{dv}-(s_{max}-s_{min})^{du}\)最大. \(Solution\) 先把物品 ...

  9. Uoj 441 保卫王国

    Uoj 441 保卫王国 动态 \(dp\) .今天才来写这个题. 设 \(f[u][0/1]\) 表示子树 \(u\) 中不选/选 \(u\) 时的最小权值和,显然有:\(f[u][0]=\sum ...

随机推荐

  1. 改革春风吹满地,安卓新系统Q上线腾讯WeTest

    “刚要适配安卓派,Q就来了.” 3月14日谷歌推出了期待已久的Android Q的首个测试版本Android Q Beta 1 ,这是Android系统推出以来的第十个大版本. 安卓Q相比之前的版本, ...

  2. 应用.NET控制台应用程序开发批量导入程序。

    一.最近一直在调整去年以及维护去年开发的项目,好久没有在进行个人的博客了.每天抽了一定的时间在研究一些开源的框架,Drapper 以及NHibernate以及当前比较流行的SqlSuper框架 并进行 ...

  3. How to: Display a Non-Persistent Object's List View from the Navigation

    This example demonstrates how to display a non-persistent object's List View when a navigation item ...

  4. 通过ftp同步服务器文件:遍历文件夹所有文件(含子文件夹、进度条);简单http同步服务器文件实例

    该代码主要实现,指定ftp服务地址,遍历下载该地址下所有文件(含子文件夹下文件),并提供进度条显示:另外附带有通过http地址方式获取服务器文件的简单实例 废话不多说,直接上代码: 1.FTPHelp ...

  5. 【SIKIA计划】_07_Unity3D游戏开发-坦克大战笔记

    [新增分类][AudioClips]音频剪辑[AudioMixers]音频混合器[Editor][Fonts]字体[Materials]材质[Models]模型[Standard Assets] [渲 ...

  6. Spring中的数据库事物管理

    Spring中的数据库事物管理 只要给方法加一个@Transactional注解就可以了 例如:

  7. Workbook对象的方法总结(二)

    (1).Worksheet 对象有 row_dimensions 和 column_dimensions 属性,控制行高和列宽. 例如: >>> sheet.row_dimensio ...

  8. notion笔记

    不错的笔记应用, 模式新颖, 正在使用, 如有相同使用者可以入群交流 notion QQ群 725638123

  9. watch命令详解

    基础命令学习目录首页 原文链接:https://www.cnblogs.com/kaishirenshi/p/7727986.html watch 命令详解: author:headsen  chen ...

  10. Python基础_内置函数

        Built-in Functions     abs() delattr() hash() memoryview() set() all() dict() help() min() setat ...