题目描述

Ivan unexpectedly saw a present from one of his previous birthdays. It is array of n numbers from 1 to 200. Array is old and some numbers are hard to read. Ivan remembers that for all elements at least one of its neighbours ls not less than it, more formally:
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.

输入

First line of input contains one integer n (2≤n≤105) — size of the array.

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.

输出

Print number of ways to restore the array modulo 998244353.

样例输入

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相关推荐

  1. Codeforces Round #518 (Div. 2): D. Array Without Local Maximums(DP)

    题意: 有一个长度为n的序列,满足对于所有的a[x],与它相邻的两个元素a[x-1]和a[x+1]中至少有一个大于等于它,其中a[1]和a[n]当然只有一个相邻元素, 现在这个序列中有些数字被破坏了( ...

  2. ICPC2008哈尔滨-E-Gauss Elimination

    题目描述 Li Zhixiang have already been in "Friendship" ocean-going freighter for three months. ...

  3. Codeforces2000分左右DP泛刷

    乱七八糟的DP题随便刷刷 文章目录 CF148E - Porcelain CF1131D - Gourmet choice CF629C - Famil Door and Brackets CF895 ...

  4. 基于OpenPose的人体姿态检测两个群众

    一.概述 OpenPose最开始由卡内基梅隆大学提出,其主要基于先后发表的几篇文章中提出的模型中进行实现: CVPR 2016: Convolutional Pose Machine(CPM) CVP ...

  5. 基于OpenPose的人体姿态检测(非常好)

    参考:https://blog.csdn.net/yph001/article/details/83218839 一.概述 OpenPose最开始由卡内基梅隆大学提出,其主要基于先后发表的几篇文章中提 ...

  6. 自制小强机器人,能看能听能说能画

    1 概述 首先可以先看下小强机器人上个版本: 自己制作智能语音机器人(基于jetson nano)自己制作智能语音机器人(基于jetson nano)_智能语音机器人开发_AI强仔的博客-CSDN博客 ...

  7. Python+OpenCV+OpenPose实现人体姿态估计(人体关键点检测)

    目录 1.人体姿态估计简介 2.人体姿态估计数据集 3.OpenPose库 4.实现原理 5.实现神经网络 6.实现代码 1.人体姿态估计简介 人体姿态估计(Human Posture Estimat ...

  8. OpenCV标准霍夫直线检测详解

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转载自:OpenCV学堂 霍夫直线检测 对于图像来说可以从笛卡 ...

  9. OpenCV深度神经网络实现人体姿态评估

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 OpenCV DNN模块介绍 OpenCV自从发布了DNN模块之后 ...

最新文章

  1. mysql 元数据获取_[MySQL] 获取元数据的步骤
  2. 《大数据》杂志——大数据技术发展的十个前沿方向(中)
  3. GDI对象泄漏检查的一点经验
  4. PySlowFast 视频理解代码库
  5. udp聊天?使用udp+python实现多人聊天室
  6. 第九部分 项目沟通管理
  7. ESD(静电释放)下半部分
  8. 360,驱动精灵文件夹删除方法,解决管理员权限下仍无法删除的问题!
  9. 什么是PPI,有什么作用?
  10. JFreeChart饼状图显示百分比
  11. I/O函数 writel __raw_writel mb()/rmb()/wmb()
  12. Boom 3D官方汉化免费下载激活版
  13. 用Qt做的拼图小游戏
  14. Java实现简单的日历小程序之Java图形界面开发小日历
  15. Flink学习-DataStream-HDFSConnector(StreamingFileSink)
  16. 企业官网小程序有什么作用
  17. C语言实现输入三次密码进行登录
  18. 通过CTFShow例题掌握爆破方法
  19. SAP MM 供应商无英文名称,ME21N里却带出了英文名字?
  20. 冬登高峰山,问禅铁瓦寺

热门文章

  1. python - django (auth 的使用)
  2. 微信小程序,时间戳和日期格式互相转化
  3. 缩进动画Scaleanimation的一个小示例
  4. python学习第二十八节(进程,线程)
  5. 描述关系型数据库中的三种关系
  6. linux 单引号,双引号,反引号的小总结。
  7. oracle 窗口函数over
  8. linux debain systemd 开机启动 nodejs 兼容原initd启动 forever 开机自启
  9. Flex AdvancedDataGrid 数据展示异常
  10. Flex Application里的addChild()