[P4063][JXOI2017]数列(DP)
题目描述
九条可怜手上有一个长度为 n 的整数数列 ri,她现在想要构造一个长度为 n 的,满足如下条件的整数数列 A:
• 1 ≤ Ai ≤ ri。
• 对于任意 3 ≤ i ≤ n,令 R 为 A1 至 Ai−2 中大于等于 Ai−1 的最小值,L 为 A1 至 Ai−2中小于等于 Ai−1 的最大值。Ai 必须满足 L ≤ Ai ≤ R。如果不存在大于等于 Ai−1 的,那么 R = +∞;如果不存在小于等于 Ai−1 的,那么 L = −∞。
现在可怜想要知道共有多少不同的数列满足这个条件。两个数列 A 和 B 是不同的当且仅当至少存在一个位置 i 满足 Ai ≠ Bi。
输入输出格式
输入格式:
第一行输入一个整数 n,第二行输入 n 个整数 ri。
输出格式:
输出一个整数表示方案数,答案可能很大,对 998244353 取模后输出。
输入输出样例
说明
满足条件的序列有 [1, 1, 1], [1, 2, 1], [1, 2, 2], [2, 1, 1], [2, 1, 2], [2, 2, 2]。
测试点编号
1.2 n<=7 ri<=7
3.4 n<=50 ri<=10
5.6 n<=50 ri<=16
7.8 n<=50 ri<=50
9.10 n<=50 ri<=150
https://blog.csdn.net/dofypxy/article/details/79145068
#include<cstdio>
#include<cstring>
#include<algorithm>
#define rep(i,l,r) for (int i=l; i<=r; i++)
using namespace std; const int N=,mod=;
int n,ans,r[N],mx,f[N][N][N],sl[N][N][N],sr[N][N][N]; int main(){
freopen("P4063.in","r",stdin);
freopen("P4063.out","w",stdout);
scanf("%d",&n);
rep(i,,n) scanf("%d",&r[i]),mx=max(mx,r[i]+);
rep(i,,mx) sl[][i][mx]=sr[][][i]=;
rep(i,,n){
memset(f,,sizeof(f));
rep(a,,r[i]){
rep(L,,a-) rep(R,a+,mx) f[a][L][R]=(sl[L][L][R]+sr[R][L][R])%mod;
rep(R,a,mx) f[a][a][a]=(f[a][a][a]+sl[a][mx][R])%mod;
rep(a1,,mx) if (a1!=a) f[a][a][a]=(f[a][a][a]+sl[a1][a1][a]+sr[a1][a][a1])%mod;
}
memset(sl,,sizeof(sl)); memset(sr,,sizeof(sr));
rep(a,,r[i]) rep(L,,mx) rep(R,a,mx) sl[a][L][R]=(f[a][L][R]+(L ? sl[a][L-][R] : ))%mod;
rep(a,,r[i]) rep(L,,a) for (int R=mx; ~R; R--) sr[a][L][R]=(f[a][L][R]+sr[a][L][R+])%mod;
}
rep(a,,r[n]) rep(L,,a) rep(R,a,mx) ans=(ans+f[a][L][R])%mod;
printf("%d\n",ans);
return ;
}
[P4063][JXOI2017]数列(DP)的更多相关文章
- 洛谷P4063 [JXOI2017]数列(dp)
题意 题目链接 Sol 这题想还是不难想的,就是写起来很麻烦,然后去看了一下loj的最短代码表示只能Orz 首先不难发现一条性质:能够选择的区间一定是不断收缩的,而且新的可选区间一定是旧区间的某个位置 ...
- BZOJ 2431: [HAOI2009]逆序对数列( dp )
dp(i,j)表示1~i的全部排列中逆序对数为j的个数. 从1~i-1的全部排列中加入i, 那么可以产生的逆序对数为0~i-1, 所以 dp(i,j) = Σ dp(i-1,k) (j-i+1 ≤ k ...
- BZOJ2431:[HAOI2009]逆序对数列(DP,差分)
Description 对于一个数列{ai},如果有i<j且ai>aj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组成的 数列,可以很容易求出有多少个逆序对数.那么逆 ...
- [编程题] 小易喜欢的数列 dp
https://www.nowcoder.com/question/next?pid=6291726&qid=112729&tid=12736753 [编程题] 小易喜欢的数列 时间限 ...
- 【bzoj2431】[HAOI2009]逆序对数列 dp
题目描述 对于一个数列{ai},如果有i<j且ai>aj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组成的 数列,可以很容易求出有多少个逆序对数.那么逆序对数为k的这 ...
- 不等式数列 DP
度度熊最近对全排列特别感兴趣,对于1到n的一个排列,度度熊发现可以在中间根据大小关系插入合适的大于和小于符号(即 '>' 和 '<' )使其成为一个合法的不等式数列.但是现在度度熊手中只有 ...
- BZOJ 2431 逆序对数列 DP
2431: [HAOI2009]逆序对数列 Time Limit: 5 Sec Memory Limit: 128 MB Description 对于一个数列{ai},如果有i< j且ai> ...
- luoguP1415 拆分数列 [dp]
题目描述 给出一列数字,需要你添加任意多个逗号将其拆成若干个严格递增的数.如果有多组解,则输出使得最后一个数最小的同时,字典序最大的解(即先要满足最后一个数最小:如果有多组解,则使得第一个数尽量大:如 ...
- [BZOJ2431][HAOI2009]逆序对数列(DP)
从小到大加数,根据加入的位置转移,裸的背包DP. #include<cstdio> #include<cstring> #include<algorithm> #d ...
随机推荐
- 【BZOJ】3329: Xorequ
[题意]给定方程x^3x=2x,求<=x和<=2^x的满足方程的正整数个数. [算法]数位DP,矩阵快速幂 [题解]异或相当于不进位加法. 移项得,x^2x=3x,又因为x+2x=3x,所 ...
- 简易微信小程序签到功能
一.效果图 点击签到后 二.数据库 用一张数据表存用户签到的信息,每次用户签到都会往表中添加一条记录了用户id和签到日期的数据,如下图 三.后端 后端写两个接口,一个用于查询用户今日是否签到和签到记录 ...
- Vue组件-动态组件
动态组件 通过使用保留的 <component> 元素,动态地绑定到它的 is 特性,可以让多个组件使用同一个挂载点,并动态切换: <div id="app6"& ...
- centos7系统安装配置
下载centos7 iso镜像 电脑里面本来有ubuntu系统,直接在u盘做好启动盘安装即可,选择手动分区(忘了),将原本ubuntu系统分区压缩200G.系统不要选择最小化,选择gnome的图形界面 ...
- monkey测试===Monkey测试策略(系列二)转
Monkey的测试策略 一. 分类 Monkey测试针对不同的对象和不同的目的采用不同的测试方案,首先测试的对象.目的及类型如下: 测试的类型分为:应用程序的稳定性测试和压力测试 测试对象分为:单一a ...
- [转载]关于python字典类型最疯狂的表达方式
一个Python字典表达式谜题 让我们探究一下下面这个晦涩的python字典表达式,以找出在python解释器的中未知的内部到底发生了什么. # 一个python谜题:这是一个秘密 # 这个表达式计算 ...
- glob模块的使用
glob模块 功能描述:glob模块可以使用Unix shell风格的通配符匹配符合特定格式的文件和文件夹,跟windows的文件搜索功能差不多.glob模块并非调用一个子shell实现搜索功能,而是 ...
- Phoenix批量修改数据
很简单的一个东西,查了挺久的,浪费了很多的时间 直接用Upsert Into Select就可以了 例:把tables表中cloumn2列等于bbb的都改成aaa Upsert Into Table ...
- WordPress个人博客搭建
搭建LNMP环境 请参考前面的博文自行搭建 部署WordPress #创建数据库和用户 mysql -uroot -p123456 -S /data/3306/mysql.sock create da ...
- Single Number I&& II——还没看,倒过头来再看
Single Number I Given an array of integers, every element appears twice except for one. Find that si ...