UOJ


序列中的每个位置是等价的。直接令\(f[i][j]\)表示,\(i\)个数的序列,最大值不超过\(j\)的所有序列每个长为\(k\)的子区间最大值的乘积的和。
由\(j-1\)转移到\(j\)时,考虑枚举第一个\(j\)出现在哪里。设最左边的\(j\)在\(p\)位置,那么会对左端点在\([\max(1,p-k+1),\ \min(p,i-k+1)]\)的每个\(k\)区间造成\(w[j]\)的贡献,也就是\(w[j]^{len}\)。\(p\)左边没出现过\(j\),贡献是\(f[p-1][j-1]\);\(p\)右边还可能出现\(j\),贡献是\(f[i-p][j]\)。
所以有\(f[i][j]=f[i][j-1]+\sum_{p=1}^{i}f[p-1][j-1]*w[j]^{len}*f[i-p][j]\)。

注意初始化的问题,\(f[i][j]\ (i<k)\)的初值是\(j^i\),即序列个数。(这样\(i\geq k\)的时候是会考虑序列所有构成的)

复杂度\(O(n^3)\)。


//1447ms    2052kb
#include <cstdio>
#include <cctype>
#include <algorithm>
#define mod 998244353
#define gc() getchar()
typedef long long LL;
const int N=505;
const LL LIM=1ll<<61;int pw[N][N],f[N][N];inline int read()
{int now=0,f=1;register char c=gc();for(;!isdigit(c);c=='-'&&(f=-1),c=gc());for(;isdigit(c);now=now*10+c-48,c=gc());return now*f;
}
inline int FP(int x,int k)
{int t=1;for(; k; k>>=1,x=1ll*x*x%mod) k&1&&(t=1ll*x*t%mod);return t;
}int main()
{const int n=read(),K=read();for(int i=1; i<=n; ++i){int w=read(); pw[i][0]=1;for(int j=1,wn=w; j<=n; ++j,w=1ll*w*wn%mod) pw[i][j]=w;}for(int i=0; i<=n; ++i) f[0][i]=1;for(int i=1; i<=n; ++i)for(int j=1; j<=n; ++j)if(i<K) f[i][j]=FP(j,i);else{LL tmp=f[i][j-1];for(int p=1; p<=i; ++p)tmp+=1ll*f[p-1][j-1]*f[i-p][j]%mod*pw[j][std::min(p,i-K+1)-std::max(1,p-K+1)+1], tmp>=LIM&&(tmp%=mod);f[i][j]=tmp%mod;}printf("%d\n",f[n][n]);return 0;
}

转载于:https://www.cnblogs.com/SovietPower/p/10760328.html

UOJ.311.[UNR#2]积劳成疾(DP)相关推荐

  1. 【uoj#311】[UNR #2]积劳成疾 dp

    题目描述 一个长度为 $n$ 的不确定序列,每个数在 $[1,n]$ 之间.给出 $m$ ,求所有序列的 $\prod_{i=1}^{n-m+1}w[\text{Max}_{j=i}^{j+m-1}a ...

  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

    题意 有n个位置,每个位置上的数是1到n中的任意一个,显然总的方案有nnnnn^n种.对于每一种方案,定义其价值为w[max(a[1..k])]∗w[max(a[2..k+1])]∗...∗w[max ...

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

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

  6. [DP] UOJ #311. 【UNR #2】积劳成疾

    fi,jf_{i,j}表示长为 ii 的区间 最大值是jj 的答案 转移就枚举最左边的最大值在区间的位置 前缀和优化下就好了 好像也可以fi,j,kf_{i,j,k}表示前 ii 个,末尾 KK 个中 ...

  7. [期望DP] UOJ#311. 【UNR #2】积劳成疾

    题意 题解 我太菜了-- 看官方题解吧: #include<cstdio> #include<algorithm> using namespace std; typedef l ...

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

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

  9. UOJ#311. 【UNR #2】积劳成疾

    https://winniechen.cn/?p=152 转载于:https://www.cnblogs.com/Winniechen/p/9306212.html

最新文章

  1. 软件开发面试_如何为成功的软件开发工作面试做准备
  2. 应用于真实世界机器人的强化学习
  3. 10.2.2移动产品离线功能等具体解释----暨4月8日移动《在离线一体化》公开课Qamp;A...
  4. 腾讯云linux服务器怎么使用图形化界面_自己搭建一个自动签到和远程下载的服务器...
  5. (管道| / 重定向 / xargs)/find 与xargs结合使用/vi,grep,sed,awk(支持正则表达式的工具程序)
  6. 没有完美的软件:编程永远不容易
  7. linux内核ufs设备树,Linux内核初始化流程笔记
  8. Java限流之 —— Guawa
  9. python fun函数、求4x4整型数组的主对角线元素的和_python中多维数组中列major的numpy整形...
  10. Gentoo下cacti的安装
  11. APP 测试用例(大部分 APP 通用)
  12. Android 项目必备(二十)-->NFC 的基本使用
  13. FFMPEG录屏(12)---- DXGI 捕获桌面
  14. 惠普触控板使用指南_手势操作更简便 笔记本触控板使用简介
  15. java程序员从小工到专家成神之路(2020版)-持续更新中,附详细文章教程
  16. 【转】矩阵运算所满足的定律
  17. 较全的国外学术论文网站与常用的学术搜索引擎
  18. python:pygame小游戏(三)—— 打字游戏
  19. 1bit 寄存器 coursera
  20. 执一不二 跬步千里-王子密码10月份月会心得(四)

热门文章

  1. PythonElementTree
  2. Vue 路由 过渡动效 数据获取
  3. log4j配置文件详解
  4. Struts2笔记——result结果类型
  5. 家中电脑无法共享,联通域名解析劫持竟是罪魁
  6. 浅蓝色的爱划过天空(5)
  7. 系统无法正确检测到盘符
  8. mpi4py多进程实例/举例
  9. 人工智能和机器学习的基本实现过程总结
  10. python whl大全