题目

考虑直接顺着从\(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;
}

转载于:https://www.cnblogs.com/asuldb/p/11358621.html

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. [DP] UOJ #311. 【UNR #2】积劳成疾

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

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

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

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

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

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

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

  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】积劳成疾(期望dp)

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

最新文章

  1. c语言选择题写小写字母表,C语言选择题(最全版).doc
  2. 第一次来请大家多多关照---毕业生找工作篇
  3. pthread调度策略,优先级和竞争范围
  4. 1.使用sizeof计算类的大小
  5. CK11N对物料进行价格标记时,系统提示物料递归错误;物料的BOM里面勾选了“递归允许”。
  6. boost::mp11::mp_count相关用法的测试程序
  7. SecureCRTSecureFX_HH_x64_7.0.0.326 crt部署项目到服务器
  8. Android开发笔记(四十八)Thread类实现多线程
  9. [CF]Round 516
  10. linux底下dig命令报错
  11. 【分享】豆瓣上排名top100的书籍
  12. 电脑win7支持的node.js版本
  13. 如何随时随地免费使用中国知网?
  14. 类抽屉问题的C++解决
  15. 学栈和队列时的人生感悟
  16. 酒店管理系统的设计与实现/酒店客房管理系统/酒店预定系统
  17. getchar函数的用法
  18. 期货配资的优势和劣势
  19. 十大三维动画制作软件(转载)
  20. Pycharm terminal激活虚拟环境

热门文章

  1. bps、Byte、MiB、bit、bits之间的关系
  2. Altium Designer 18中的PCB Editor–Board Insight Display
  3. 【解决】ScriptableObject.ctor is not allowed to be called from a MonoBehaviour constructor...
  4. 蔚然的风,你一阵吹过
  5. 马虎词汇教程6-10(转载)
  6. Ubuntu系统界面启动后启动开机自启动后锁屏
  7. 硬件电路设计原理图设计
  8. html5游戏需求文档,游戏PRD丨狼人杀APP产品需求文档
  9. URP - Render feature实现镜面反射
  10. 假期读书计划表怎么写?能够随时查看读书计划的手机便签