uoj #311.【UNR #2】积劳成疾 dp
题意
有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相关推荐
- UOJ.311.[UNR#2]积劳成疾(DP)
UOJ 序列中的每个位置是等价的.直接令\(f[i][j]\)表示,\(i\)个数的序列,最大值不超过\(j\)的所有序列每个长为\(k\)的子区间最大值的乘积的和. 由\(j-1\)转移到\(j\) ...
- 【uoj#311】[UNR #2]积劳成疾 dp
题目描述 一个长度为 $n$ 的不确定序列,每个数在 $[1,n]$ 之间.给出 $m$ ,求所有序列的 $\prod_{i=1}^{n-m+1}w[\text{Max}_{j=i}^{j+m-1}a ...
- 【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 ...
- [DP] UOJ #311. 【UNR #2】积劳成疾
fi,jf_{i,j}表示长为 ii 的区间 最大值是jj 的答案 转移就枚举最左边的最大值在区间的位置 前缀和优化下就好了 好像也可以fi,j,kf_{i,j,k}表示前 ii 个,末尾 KK 个中 ...
- [期望DP] UOJ#311. 【UNR #2】积劳成疾
题意 题解 我太菜了-- 看官方题解吧: #include<cstdio> #include<algorithm> using namespace std; typedef l ...
- uoj#311 【UNR #2】积劳成疾
题目 考虑直接顺着从\(1\)填数填到\(n\)发现这是在胡扯 所以考虑一些奇诡的东西,譬如最后的答案长什么样子 显然某一种方案的贡献是一个\(\prod_{i=1}^nw_i^{t_i}\)状物,\ ...
- UOJ#311. 【UNR #2】积劳成疾
https://winniechen.cn/?p=152 转载于:https://www.cnblogs.com/Winniechen/p/9306212.html
最新文章
- Linux下安装Tomcat启动报错
- 5月14日 游戏闯关,
- ACL 2021 | SimCLS: 概念简单但足够有效的对比学习摘要生成框架
- 2020年十月下旬,再次更新了自己的linkedin工作经历
- j2ee 和 j2se_在J2SE应用中模拟CDI的会话和请求范围
- C/C++之vector的内存管理和效率
- java 路径获取文件名称_java 根据文件获取文件名及路径的方法
- Struts2_4_ActionMap与ValueStack详解_Struct2的EL及常用标签_防止表单数据重复提交
- 在玩客云上部署code-server
- 阿帕奇与php整合,整合apache和php
- python程序设计与应用第1章
- 大数据之-Hadoop伪分布式_配置文件说明---大数据之hadoop工作笔记0029
- PHP全路径无限分类导航LINK代码实现
- 二维码生成易语言代码
- 软件工程经济学工程认证作业整理
- 计算机的安全保障机制,技术安全保障管理制度
- c#PNG转换图片JPEG
- 【043】光盘库编码
- 【数学建模】经典简单例题实例1
- WinForm的控件二次开发
热门文章
- 漫步数学分析十九——介值定理
- SketchUp: Modeling Interiors from Photos SketchUp:从照片建模室内设计 Lynda课程中文字幕
- 计算机系统仿真缩写,仿真语言
- 使用计算机的弊端,不可忽视的伤害 用电视接电脑弊端揭露
- 【橙子】C#Unity--2D迷宫
- 网页如何展示PPT文档
- 【移动应用开发】2022/2023 年 8 大移动应用程序开发趋势
- 华为网络实验--动态路由器+RIP路由协议配置及验证
- 两年数据对比柱形图_举个栗子!Tableau 技巧(152):横向对比堆叠柱形图的各部分占比...
- 论文 | 图理论 | 2021年斯坦福大学Jiaxuan You博士论文《用图赋能深度学习》译读 摘要和感谢