题目描述

九条可怜手上有一个长度为 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: 复制

3
2 2 2

输出样例#1: 复制

6

说明

满足条件的序列有 [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

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define rep(i,l,r) for (int i=l; i<=r; i++)
 5 using namespace std;
 6
 7 const int N=155,mod=998244353;
 8 int n,ans,r[N],mx,f[N][N][N],sl[N][N][N],sr[N][N][N];
 9
10 int main(){
11     freopen("P4063.in","r",stdin);
12     freopen("P4063.out","w",stdout);
13     scanf("%d",&n);
14     rep(i,1,n) scanf("%d",&r[i]),mx=max(mx,r[i]+1);
15     rep(i,0,mx) sl[0][i][mx]=sr[0][0][i]=1;
16     rep(i,1,n){
17         memset(f,0,sizeof(f));
18         rep(a,1,r[i]){
19             rep(L,0,a-1) rep(R,a+1,mx) f[a][L][R]=(sl[L][L][R]+sr[R][L][R])%mod;
20             rep(R,a,mx) f[a][a][a]=(f[a][a][a]+sl[a][mx][R])%mod;
21             rep(a1,0,mx) if (a1!=a) f[a][a][a]=(f[a][a][a]+sl[a1][a1][a]+sr[a1][a][a1])%mod;
22         }
23         memset(sl,0,sizeof(sl)); memset(sr,0,sizeof(sr));
24         rep(a,1,r[i]) rep(L,0,mx) rep(R,a,mx) sl[a][L][R]=(f[a][L][R]+(L ? sl[a][L-1][R] : 0))%mod;
25         rep(a,1,r[i]) rep(L,0,a) for (int R=mx; ~R; R--) sr[a][L][R]=(f[a][L][R]+sr[a][L][R+1])%mod;
26     }
27     rep(a,1,r[n]) rep(L,0,a) rep(R,a,mx) ans=(ans+f[a][L][R])%mod;
28     printf("%d\n",ans);
29     return 0;
30 }

转载于:https://www.cnblogs.com/HocRiser/p/8806973.html

[P4063][JXOI2017]数列(DP)相关推荐

  1. 小魂和他的数列(dp+树状数组优化)

    链接:https://ac.nowcoder.com/acm/contest/3566/C 来源:牛客网 Sometimes, even if you know how something's goi ...

  2. 杭电oj1257最少拦截系统—贪心/dp最大递增子序列

    附上题目链接:杭电oj1257 这个题目有动态规划和贪心两种解决方式. 贪心法1: 对于导弹我们知道只可以从大到小的反导,一个系统必须从大到小排列.那么我们就可以选择从最高的那个导弹入手,往右找仅次于 ...

  3. 剑指Offer - 面试题46. 把数字翻译成字符串(DP)

    1. 题目 给定一个数字,我们按照如下规则把它翻译为字符串: 0 翻译成 "a" , 1 翻译成 "b",--, 11 翻译成 "l",-- ...

  4. POJ1887 DP水题儿

    http://poj.org/problem?id=1887 题目很基础,就是求 最长减子数列 dp[i]=max{  max{  dp[j]+1 (arr[i]<arr[j]  ;  1< ...

  5. 算法笔记_172:历届试题 波动数列(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 观察这个数列: 1 3 0 2 -1 1 -2 ... 这个数列中后一项总是比前一项增加2或者减少3. 栋栋对这种数列很好奇,他想知道长度 ...

  6. [总结]2019年9月 OI学习/刷题记录

    从现在开始记录一下每天的学习情况.主力LOJ? 2019/9/5 LibreOJ #2543. 「JXOI2018」排序问题 答案显然是\(\frac{(n+m)!}{Cnt_1!Cnt_2!\cdo ...

  7. 湖南雅礼培训 1.1

    练习赛 一.题目概览 中文题目名称 树 红与蓝 猜数列 英文题目名称 tree rab hidden 可执行文件名 tree rab hidden 输入文件名 tree.in rab.in hidde ...

  8. 每日刷题记录 (一)

    文章目录 第一题: 按摩师 解题思路: 代码实现: 第二题: 主要元素 解题思路: 代码实现: 第三题: 第 k 个数 解题思路: 代码实现: 第四题: 连续数列 解题思路: 代码实现: 第五题: 面 ...

  9. 第十四届蓝桥杯大赛软件赛省赛 C/C++ 大学 B 组

    第十四届蓝桥杯大赛软件赛省赛 C/C++ 大学 B 组 注意!!!!!!!!!!这篇题解为赛时的个人做法,不代表是正确的,仅供参考. 更新:思路上应该都对,很多题都有细节错误,代码不用看了,太久没敲代 ...

最新文章

  1. 刘光瑞php,PHP Markdown 解析器 HyperDown
  2. Python爬虫框架--Scrapy
  3. RTC_WaitForSynchro()
  4. 【Spring】Spring高级话题-@Enable***注解的工作原理
  5. 一个顶级程序员要多久才能独自写完Win10代码?
  6. vux loadmore + axios 实现点击加载更多
  7. Java 源程序的良好书写规范有哪些,Java 程序书写规范
  8. 关于T_SQL中声明变量类型的基础知识。
  9. 解码H264帧要注意的两个问题
  10. C# 导入.reg文件
  11. P2132 小Z的队伍排列-杨氏矩阵与hook定理
  12. 微信支付回调页面html,微信JSAPI支付成功后获取回调数据
  13. 计算机报名没有有效的安全证书,win10 因为没有使用有效的安全证书进行签名怎么解决...
  14. dpdk pmd驱动初始化
  15. 第一次作业——————打印沙漏
  16. 百度搜索引擎 VS 360搜索引擎
  17. 软件测试需要学习什么
  18. Chapter1:初见ROS
  19. 开启Intel VT-x
  20. 杭州星滔企业管理公司成立 马云持股

热门文章

  1. HBase从入门到精通系列:误删数据如何抢救?
  2. 我如何将亿次的计算降为实时
  3. 2018第九届山东省ACM省赛
  4. 374. Guess Number Higher or Lower
  5. HDU 4704 Sum (费马小定理)
  6. 使用分层网络模型的两个优点是什么_从零开始学网络|搞懂OSI参考模型和TCP/IP分层模型,看这篇文章就够了...
  7. ApplicationMaster启动流程
  8. HBase之MemStore flush流程
  9. HBase架构设计及原理分析
  10. (37)FPGA面试题实现约翰逊计数器