[DP] UOJ #311. 【UNR #2】积劳成疾
来源:互联网 发布:采购询价软件 编辑:程序博客网 时间:2024/06/05 02:50
转移就枚举最左边的最大值在区间的位置 前缀和优化下就好了
好像也可以
#include<cstdio>#include<cstdlib>#include<algorithm>using namespace std;typedef long long ll;#define read(x) scanf("%d",&(x))const int N=405;const int P=998244353;int n,K;int w[N];int f[N][N],g[N][N];inline void add(int &x,int y){ x+=y; if (x>=P) x-=P;}inline int calc(int i,int k){ return max(0,i-K+1)-max(0,k-1-K+1)-max(0,i-k-K+1);}inline ll Pow(ll a,int b){ ll ret=1; for (;b;b>>=1,a=a*a%P) if (b&1) ret=ret*a%P; return ret;}int pw[N][N];int tmp[N][N];int main(){ freopen("t.in","r",stdin); freopen("t.out","w",stdout); read(n); read(K); for (int i=1;i<=n;i++) read(w[i]); for (int i=0;i<=n;i++) f[0][i]=1; for (int i=1;i<=n;i++) for (int j=0;j<=n;j++) pw[i][j]=Pow(w[i],j); for (int i=1;i<=n;i++) for (int j=1;j<=i;j++) tmp[i][j]=calc(i,j); for (int i=1;i<=n;i++){ for (int j=1;j<=n;j++) for (int k=1;k<=i;k++) add(f[i][j],(ll)f[k-1][j-1]*f[i-k][j]%P*pw[j][tmp[i][k]]%P); for (int j=1;j<=n;j++) add(f[i][j],f[i][j-1]); } printf("%d\n",f[n][n]); return 0;}
阅读全文
0 0
- [期望DP] UOJ#311. 【UNR #2】积劳成疾
- [DP] UOJ #311. 【UNR #2】积劳成疾
- [组合] UOJ#308. 【UNR #2】UOJ拯救计划
- [FWT] UOJ#310. 【UNR #2】黎明前的巧克力
- [FWT] UOJ #310. 【UNR #2】黎明前的巧克力
- [色多项式] UOJ #308. 【UNR #2】UOJ拯救计划 & SRM 717 div1 AcyclicOrientation
- UOJ#218 【UNR #1】火车管理
- UOJ#214. 【UNR #1】合唱队形
- [期望] UOJ #214. 【UNR #1】合唱队形
- UOJ#213——【UNR #1】争夺圣杯
- UOJ#217. 【UNR #1】奇怪的线段树
- [期望DP] UNR #1 合唱队形
- 【UOJ #218. 【UNR #1】】火车管理 可持久化线段树
- [UOJ 28][IOI 2014]Friend(DP)
- 【uoj#149】【NOIP2015】子串 DP
- 【UOJ#149】【NOIP2015】子串【计数DP】
- [UOJ#149][NOIP2015]子串(dp)
- [DP 分块] UOJ #300. 【CTSC2017】吉夫特
- “找炸弹”
- 类型安全是?
- 写出一个程序,接受一个有字母和数字以及空格组成的字符串,和一个字符,然后输出输入字符串中含有该字符的个数。不区分大小写。
- Unity3d 技巧(3)-如何在自己的程序中 Shader.Find 到自己写的shader
- Appium Android 获取包名和 Activity 的几种方法
- [DP] UOJ #311. 【UNR #2】积劳成疾
- 系统服务管理
- 谁是最好的COder
- C语言学习记录 指针数组和数组指针的区别
- 协同过滤 推荐系统实战
- css_day04_盒子模型的宽度和高度理解
- Android Studio查看SHA1码
- ios-结构体和类的区别
- html5