题意

有n个位置,每个位置上的数是1到n中的任意一个,显然总的方案有nnnnn^n种。对于每一种方案,定义其价值为w[max(a[1..k])]∗w[max(a[2..k+1])]∗...∗w[max(a[n−k+1,n])]w[max(a[1..k])]∗w[max(a[2..k+1])]∗...∗w[max(a[n−k+1,n])]w[max(a[1..k])]*w[max(a[2..k+1])]*...*w[max(a[n-k+1,n])]。现在给定n,kn,kn,k和w[1..n]w[1..n]w[1..n],求所有方案的价值和。
k≤n≤400k≤n≤400k\le n\le400

分析

设f[x,y]f[x,y]f[x,y]表示长度为xxx的序列中,最大值不超过y" role="presentation" style="position: relative;">yyy的所有填数方案的价值和。
一种填法是不填yyy,那么f[x,y]=f[x,y−1]" role="presentation" style="position: relative;">f[x,y]=f[x,y−1]f[x,y]=f[x,y−1]f[x,y]=f[x,y-1]。
否则我们可以枚举第一个yyy填哪里,设为位置i" role="presentation" style="position: relative;">iii
那么f[x,y]=f[i−1,y−1]∗f[x−i,y]∗w[y]有多少个长度为k的区间包含位置if[x,y]=f[i−1,y−1]∗f[x−i,y]∗w[y]有多少个长度为k的区间包含位置if[x,y]=f[i-1,y-1]*f[x-i,y]*w[y]^{有多少个长度为k的区间包含位置i}
用记忆化搜索来实现即可。

代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>typedef long long LL;const int N=405;
const int MOD=998244353;int n,k,w[N][N],f[N][N];int ksm(int x,int y)
{int ans=1;while (y){if (y&1) ans=(LL)ans*x%MOD;x=(LL)x*x%MOD;y>>=1;}return ans;
}int dp(int x,int y)
{if (!x) return 1;if (x<k) return ksm(y,x);if (!y) return 0;if (f[x][y]) return f[x][y];f[x][y]=dp(x,y-1);for (int i=1;i<=x;i++){int l=std::max(1,i-k+1),r=std::min(x,i+k-1)-k+1;(f[x][y]+=(LL)w[y][r-l+1]*dp(i-1,y-1)%MOD*dp(x-i,y)%MOD)%=MOD;}return f[x][y];
}int main()
{scanf("%d%d",&n,&k);for (int i=1;i<=n;i++) scanf("%d",&w[i][1]);for (int i=1;i<=n;i++)for (int j=2;j<=n;j++)w[i][j]=(LL)w[i][j-1]*w[i][1]%MOD;printf("%d",dp(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]积劳成疾 dp

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

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

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

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

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

  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. Linux下安装Tomcat启动报错
  2. 5月14日 游戏闯关,
  3. ACL 2021 | SimCLS: 概念简单但足够有效的对比学习摘要生成框架
  4. 2020年十月下旬,再次更新了自己的linkedin工作经历
  5. j2ee 和 j2se_在J2SE应用中模拟CDI的会话和请求范围
  6. C/C++之vector的内存管理和效率
  7. java 路径获取文件名称_java 根据文件获取文件名及路径的方法
  8. Struts2_4_ActionMap与ValueStack详解_Struct2的EL及常用标签_防止表单数据重复提交
  9. 在玩客云上部署code-server
  10. 阿帕奇与php整合,整合apache和php
  11. python程序设计与应用第1章
  12. 大数据之-Hadoop伪分布式_配置文件说明---大数据之hadoop工作笔记0029
  13. PHP全路径无限分类导航LINK代码实现
  14. 二维码生成易语言代码
  15. 软件工程经济学工程认证作业整理
  16. 计算机的安全保障机制,技术安全保障管理制度
  17. c#PNG转换图片JPEG
  18. 【043】光盘库编码
  19. 【数学建模】经典简单例题实例1
  20. WinForm的控件二次开发

热门文章

  1. 漫步数学分析十九——介值定理
  2. SketchUp: Modeling Interiors from Photos SketchUp:从照片建模室内设计 Lynda课程中文字幕
  3. 计算机系统仿真缩写,仿真语言
  4. 使用计算机的弊端,不可忽视的伤害 用电视接电脑弊端揭露
  5. 【橙子】C#Unity--2D迷宫
  6. 网页如何展示PPT文档
  7. 【移动应用开发】2022/2023 年 8 大移动应用程序开发趋势
  8. 华为网络实验--动态路由器+RIP路由协议配置及验证
  9. 两年数据对比柱形图_举个栗子!Tableau 技巧(152):横向对比堆叠柱形图的各部分占比...
  10. 论文 | 图理论 | 2021年斯坦福大学Jiaxuan You博士论文《用图赋能深度学习》译读 摘要和感谢