题目

考虑直接顺着从\(1\)填数填到\(n\)发现这是在胡扯

所以考虑一些奇诡的东西,譬如最后的答案长什么样子

显然某一种方案的贡献是一个\(\prod_{i=1}^nw_i^{t_i}\)状物,\(t_i\)表示\(i\)在多少个长度为\(m\)的区间里为最大值

而这里又是最大值,所以可以考虑从大到小填数,每次把填完之后相应的分裂区间,同时在这个时候也可以计算一些贡献

于是我们设\(f_{l,r,k}\)表示对于区间\([l,r]\)最大值为\(k\),我们枚举这个最大值最后一次出现的位置,同时跨过这个位置长度为\(m\)的区间的最大值肯定是\(k\)了,于是我们在这里就可以计算出\(w_k\)的贡献

于是有

\[f_{l,r,k}=\sum_{i=l}^{r}w_k^{calc(r-l+1,i)}\sum_{j=1}^kf_{l,i-1,j}\times \sum_{j=1}^{k-1}f_{i+1,r,j}
\]

其中\(calc(r-l+1,i)\)表示对于一个长度为\(r-l+1\)的序列,有多少个长度为\(m\)的区间跨过\(i\)位置

发现这里能维护前缀和就能快速转移了

答案就是\(\sum_{i=1}^nf_{1,n,i}\)

同时我们发现这里维护区间太奢侈了,只要有一个区间长度我们就能转移了,所以我们直接改为维护区间长度

状态数\(n^2\),转移复杂度\(O(n)\),复杂度为\(O(n^3)\)

代码

#include<bits/stdc++.h>
#define re register
#define LL long long
const int mod=998244353;
const int maxn=403;
int n,m,w[maxn];
int dp[maxn][maxn],vis[maxn][maxn],a[maxn][maxn],b[maxn][maxn];
inline int ksm(int a,int b) {
int S=1;
for(;b;b>>=1,a=1ll*a*a%mod) if(b&1) S=1ll*S*a%mod;
return S;
}
int f(int l,int k) {
if(!l) return 1;
if(!k) return 0;
if(vis[l][k]) return dp[l][k];
if(l<m) {
vis[l][k]=1;
return dp[l][k]=ksm(k,l);
}
if(k>1) dp[l][k]=f(l,k-1);
for(re int i=0;i<l;i++)
dp[l][k]=(dp[l][k]+1ll*f(i,k)*f(l-i-1,k-1)%mod*a[k][b[l][i+1]]%mod)%mod;
vis[l][k]=1;
return dp[l][k];
}
int main() {
scanf("%d%d",&n,&m);
for(re int i=1;i<=n;i++) a[i][0]=1;
for(re int i=1;i<=n;i++) scanf("%d",&a[i][1]),w[i]=a[i][1];
for(re int i=1;i<=n;i++)
for(re int j=1;j+m-1<=i;j++)
for(re int k=j;k<=j+m-1;k++)
b[i][k]++;
for(re int i=1;i<=n;i++)
for(re int j=2;j<=n;j++)
a[i][j]=1ll*a[i][j-1]*w[i]%mod;
printf("%d\n",f(n,n));
return 0;
}

uoj#311 【UNR #2】积劳成疾的更多相关文章

  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

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

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

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

  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. Noip前的大抱佛脚----赛前任务

    赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...

随机推荐

  1. kafka?kafaka! kafka...

    kafka?kafaka! Kafka... kafka是什么? 答:Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写.Kafka是一种高吞吐量的分布式发布订阅 ...

  2. 区别 |python-pandas库set_index、reset_index用法区别

    1.set_index() 作用:DataFrame可以通过set_index方法,将普通列设置为单索引/复合索引. 格式:DataFrame.set_index(keys, drop=True, a ...

  3. 用jQuery基础

    要使用jQuery要引用jQuery文件,在头标签中引用 1 <script src="jquery-1.11.2.min.js"></script>   ...

  4. NOIp2018集训test-10-4/test-10-5 (联考四day1/day2)

    这个day1稍微有点毒瘤吧?? DAY1 排列 以前总是把day1t1想太复杂了翻车,差不多往正解的方向想了一下感觉不可能这么复杂这可是noipday1t1啊一定有非常简单的方法然后翻车了?? 题目转 ...

  5. NX二次开发-UFUN读取表格注释内容UF_TABNOT_ask_cell_text

    NX11+VS2013 #include <uf.h> #include <uf_ui.h> #include <uf_tabnot.h> #include < ...

  6. NX二次开发-算法篇-找相切面

    方法1:通过判断相邻面公共边的光顺性来找相切面 1 #include <uf.h> 2 #include <uf_modl.h> 3 #include <uf_obj.h ...

  7. centos 根目录扩容

    添加一块磁盘 参考上一篇博文VMware Workstation 添加磁盘 挂载目录(centos) 查看当前磁盘挂载情况 [root@node1 ~]# fdisk -l Disk /dev/sda ...

  8. 使用反射机制,获取 ArrayList 的容量大小

    本文所有说明及代码示例都是基于JDK 1.8  ArrayList 提供size()方法获取当前集合的元素数量,但无法知道当前集合的容量,翻看 ArrayList 的源代码,可以看到字段 elemen ...

  9. spark2.+ sql 性能调优

    1.在内存中缓存数据 性能调优主要是将数据放入内存中操作,spark缓存注册表的方法 版本 缓存 释放缓存 spark2.+ spark.catalog.cacheTable("tableN ...

  10. 3.1_springboot2.x检索之elasticsearch安装&快速入门

    1.elasticsearch简介&安装 1.1.1.elasticsearch介绍 ​ 我们的应用经常需要添加检索功能,开源的 ElasticSearch 是目前全文搜索引擎的首选.他可以快 ...