需要锻炼$ DP$能力

UOJ #311


题意

等概率产生一个长度为$ n$且每个数在[1,n]间随机的数列

定义其价值为所有长度为$ k$的连续子数列的最大值的乘积

给定$ n,k$求所有合法数列的价值和


题解

设$ f(x,y)$表示长度为$x$的数列中,最值不超过$ y$的所有数列的价值和

若数列的最值不是$ y$则$ f(x,y)=f(x,y-1)$

否则枚举最左边的最值位置,设为位置$ i$

则$ f(x,y)$可由$f(i-1,y-1)·w(y)^{calc(i)}·f(x-i,y)$转移过来

其中$ calc(i)$表示在长度为$ x$的数列中有多少个长度为$ k$的数列包含第$ i$个位置

时间复杂度$ O(n^3)$


代码

#include<ctime>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#define p 998244353
#define rt register int
#define ll long long
using namespace std;
inline ll read(){ll x=0;char zf=1;char ch=getchar();while(ch!='-'&&!isdigit(ch))ch=getchar();if(ch=='-')zf=-1,ch=getchar();while(isdigit(ch))x=x*10+ch-'0',ch=getchar();return x*zf;
}
void write(ll y){if(y<0)putchar('-'),y=-y;if(y>9)write(y/10);putchar(y%10+48);}
void writeln(const ll y){write(y);putchar('\n');}
int k,m,n,x,y,z,cnt,ans;
int w[405];
int calc(int x,int y){int L=max(1,x-m+1),R=min(x,y-m+1);return max(0,R-L+1);
}
int f[405][405],mi[405][405];
int main(){n=read();m=read();for(rt i=1;i<=n;i++)w[i]=read();for(rt i=0;i<=n;i++)f[0][i]=1;for(rt i=1;i<=n;i++){mi[i][0]=1;for(rt j=1;j<=n;j++)mi[i][j]=1ll*mi[i][j-1]*w[i]%p;}for(rt i=1;i<=n;i++)for(rt j=1;j<=n;j++){if(j>1)f[i][j]=f[i][j-1];for(rt k=1;k<=i;k++)(f[i][j]+=1ll*f[k-1][j-1]*f[i-k][j]%p*mi[j][calc(k,i)]%p)%=p;}cout<<f[n][n];return 0;
}

转载于:https://www.cnblogs.com/DreamlessDreams/p/10249373.html

UOJ #311「UNR #2」积劳成疾相关推荐

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

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

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

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

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

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

  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】积劳成疾

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

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

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

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

    思路非常巧妙,令 $f[i][j]$ 表示前 $i$ 个数,最大值不大于 $j$ 的权和. 转移的话枚举最大值出现的第一个位置,乘上该位置对应的贡献,然后发现最大值将 $1$ ~ $i$ 分成了两半. ...

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

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

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

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

最新文章

  1. AI将成科学家“高级定制”工具
  2. aho-corasick php,GitHub - coralh/php-akm: Ahocorasick keyword match. Supports php7 and php5
  3. Java微服务(三)【本地maven配置与环境变量】(手把手编写,超级详细)
  4. loop指令 c语言,arm汇编loop指令
  5. How to bind multiple properties with formatter on one control from Ke
  6. greenplum gpfdist应用
  7. C#非泛型集合类-使用HashTable组织数据
  8. redis队列(list)
  9. 工信部:老年人拨打三大运营商客服享受一键呼入等服务
  10. postman 字符串中有冒号_【接口测试】Postman入门09 Postman获取HTTP请求
  11. 2018牛客网暑假ACM多校训练赛(第六场)I Team Rocket 线段树
  12. 【引用】MySQL定时任务
  13. 解决MAC系统字体发虚,更换默认字体为微软雅黑
  14. 商品归类查询服务_喜报 | 东泽国际获批进出口商品归类服务单位资质
  15. Gossip in Cassandra
  16. 计算机组成原理复习笔记——二、数据的表示和运算
  17. 真正牛逼的人,都是极简主义者!!
  18. mysql触发器不起作用_mysql – 授予模式触发器不起作用
  19. java飞机大战飞机背景滚动_飞机大战背景/音效动起来
  20. 【网络协议】TCP和HTTP中keep alive机制

热门文章

  1. 字节跳动测开面经(两面 + HR)
  2. 如何将mp4视频压缩到最小?
  3. Google VP8 Code 首次深入技术分析 1
  4. 如何在word中插入图表目录(插图清单、表格清单)
  5. 入门文献复现——Murphy C K——Combining belief functions when evidence conflicts
  6. [hdu6578]Blank
  7. 随心所欲b超工作站图像处理_彩超工作站B超随心所欲XP版超声随心所欲XP版
  8. Youtube2016推荐召回算法细节及最终实现(离线服务)——完整版
  9. 论文 | 图理论 | 2021年斯坦福大学Jiaxuan You博士论文《用图赋能深度学习》译读 摘要和感谢
  10. 光纤熔接操作步骤——详细图文光纤熔接教程