ICPC2008哈尔滨-A-Array Without Local Maximums
题目描述
a1≤a2,
an≤an−1 and
ai≤max(ai−1,ai+1) for all i from 2 to n−1.
Ivan does not remember the array and asks to find the number of ways to restore it. Restored elements also should be integers from 1 to 200. Since the number of ways can be big, print it modulo 998244353.
输入
Second line of input contains n integers ai — elements of array. Either ai=−1 or 1≤ai≤200. ai=−1 means that i-th element can't be read.
输出
样例输入
3 1 -1 2
样例输出
1
题意 构造一个长度为n的序列,有些位置是-1,可以填1-200的数字,要使得每个位置都比它左右两侧的最大值小,求方案数思路 dp f[i][j][0/1/2]表示到第i位,当前数为j,从i-1到i是上升/相等/下降的方案数 显然 f[i][j][0]=f[i-1][k][0]+f[i-1][k][1]+f[i-1][k][2]; k<j; f[i][j][1]=f[i-1][k][0]+f[i-1][k][1]+f[i-1][k][2]; k=j f[i][j][2]=f[i-1][k][1]+f[i-1][k][2];
#include <bits/stdc++.h> #define ll long long using namespace std; const int P=998244353; const int N=1e5+10; ll f[N][205][3]; ll sum[2][205][3]; int a[N]; int n; int main(){scanf("%d",&n);for (int i=1;i<=n;i++) scanf("%d",&a[i]);if (a[1]==-1){for (int i=1;i<=200;i++) f[1][i][0]=1;} else f[1][a[1]][0]=1;for(int i = 1; i <= 200; i++) sum[0][i][0] = (sum[0][i-1][0] + f[1][i][0])%P;for (int i=2;i<=n;i++) {//sum[!(i&1)][0][0] = sum[!(i&1)][0][1] = sum[!(i&1)][0][2] = 0;for (int j=1;j<=200;j++) {if (a[i]==-1 || a[i]==j){//f[i][j][0]=f[i-1][k][0]+f[i-1][k][1]+f[i-1][k][2]; k<j;f[i][j][0]=((sum[i&1][j-1][0]+sum[i&1][j-1][1])%P+sum[i&1][j-1][2])%P;//f[i][j][1]=f[i-1][k][0]+f[i-1][k][1]+f[i-1][k][2]; k=jf[i][j][1]=(f[i-1][j][0]+f[i-1][j][1]+f[i-1][j][2])%P;//f[i][j][2]=(f[i][j][2]+f[i-1][k][1]+f[i-1][k][2])%p;f[i][j][2]=((sum[i&1][200][1] - sum[i&1][j][1] +P)%P + (sum[i&1][200][2] - sum[i&1][j][2]+P)%P)%P;}sum[!(i&1)][j][0] = (sum[!(i&1)][j-1][0] + f[i][j][0])%P;sum[!(i&1)][j][1] = (sum[!(i&1)][j-1][1] + f[i][j][1])%P;sum[!(i&1)][j][2] = (sum[!(i&1)][j-1][2] + f[i][j][2])%P;}}// cout<<f[1][a[1]][0]<<' '<<f[1][a[1]][1]<<' '<<f[1][a[1]][2]<<endl;ll ans=0;if (a[n]==-1){for (int i=1;i<=200;i++){// printf("f[3][%d][0]=%lld,f[3][%d][1]=%lld,f[3][%d][2]=%lld\n",i,f[3][i][0],i,f[3][i][1],i,f[3][i][2]);ans=(ans+f[n][i][1]+f[n][i][2])%P;}} else ans=(f[n][a[n]][1]+f[n][a[n]][2])%P;printf("%lld\n",ans);return 0; }
View Code
k>j 枚举k的话是200*200*n,所以要前缀和优化……但可能写的过于诡异
转载于:https://www.cnblogs.com/tetew/p/11317677.html
ICPC2008哈尔滨-A-Array Without Local Maximums相关推荐
- Codeforces Round #518 (Div. 2): D. Array Without Local Maximums(DP)
题意: 有一个长度为n的序列,满足对于所有的a[x],与它相邻的两个元素a[x-1]和a[x+1]中至少有一个大于等于它,其中a[1]和a[n]当然只有一个相邻元素, 现在这个序列中有些数字被破坏了( ...
- ICPC2008哈尔滨-E-Gauss Elimination
题目描述 Li Zhixiang have already been in "Friendship" ocean-going freighter for three months. ...
- Codeforces2000分左右DP泛刷
乱七八糟的DP题随便刷刷 文章目录 CF148E - Porcelain CF1131D - Gourmet choice CF629C - Famil Door and Brackets CF895 ...
- 基于OpenPose的人体姿态检测两个群众
一.概述 OpenPose最开始由卡内基梅隆大学提出,其主要基于先后发表的几篇文章中提出的模型中进行实现: CVPR 2016: Convolutional Pose Machine(CPM) CVP ...
- 基于OpenPose的人体姿态检测(非常好)
参考:https://blog.csdn.net/yph001/article/details/83218839 一.概述 OpenPose最开始由卡内基梅隆大学提出,其主要基于先后发表的几篇文章中提 ...
- 自制小强机器人,能看能听能说能画
1 概述 首先可以先看下小强机器人上个版本: 自己制作智能语音机器人(基于jetson nano)自己制作智能语音机器人(基于jetson nano)_智能语音机器人开发_AI强仔的博客-CSDN博客 ...
- Python+OpenCV+OpenPose实现人体姿态估计(人体关键点检测)
目录 1.人体姿态估计简介 2.人体姿态估计数据集 3.OpenPose库 4.实现原理 5.实现神经网络 6.实现代码 1.人体姿态估计简介 人体姿态估计(Human Posture Estimat ...
- OpenCV标准霍夫直线检测详解
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转载自:OpenCV学堂 霍夫直线检测 对于图像来说可以从笛卡 ...
- OpenCV深度神经网络实现人体姿态评估
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 OpenCV DNN模块介绍 OpenCV自从发布了DNN模块之后 ...
最新文章
- mysql 元数据获取_[MySQL] 获取元数据的步骤
- 《大数据》杂志——大数据技术发展的十个前沿方向(中)
- GDI对象泄漏检查的一点经验
- PySlowFast 视频理解代码库
- udp聊天?使用udp+python实现多人聊天室
- 第九部分 项目沟通管理
- ESD(静电释放)下半部分
- 360,驱动精灵文件夹删除方法,解决管理员权限下仍无法删除的问题!
- 什么是PPI,有什么作用?
- JFreeChart饼状图显示百分比
- I/O函数 writel __raw_writel mb()/rmb()/wmb()
- Boom 3D官方汉化免费下载激活版
- 用Qt做的拼图小游戏
- Java实现简单的日历小程序之Java图形界面开发小日历
- Flink学习-DataStream-HDFSConnector(StreamingFileSink)
- 企业官网小程序有什么作用
- C语言实现输入三次密码进行登录
- 通过CTFShow例题掌握爆破方法
- SAP MM 供应商无英文名称,ME21N里却带出了英文名字?
- 冬登高峰山,问禅铁瓦寺