27.方向标

题目

描述

一位木匠收到了一个木制指示牌的订单。每块木板必须与前一块垂直对齐,要么与前一个箭头的基部对齐,要么与相反的一侧对齐,在那里用特制的螺钉固定。两块木板必须重叠。木匠将设计师发送的草图编码成了一个整数序列,但该序列不能确定唯一的模型,他已经把原始草图扔掉了。这看起来像是一个微不足道的任务,但对他来说却是一个巨大的拼图。

序列(有1 + N个元素)将(N)个箭头从底部到顶部的位置进行编码。第一个元素是底部箭头左侧的位置。剩余的N个元素定义了箭头头部的起始位置,从底部到顶部:第i个元素是第i个箭头基部的位置。例如,左侧和右侧的两个标志可以通过2 6 5 1 4进行编码。

由于木板必须与前一块垂直对齐(要么与前一个箭头的基部对齐,要么与相反的一侧对齐),如果序列是2 6 5 1 4 3,第五个箭头可以用一个螺钉固定(在任何一个描绘的标志上)在1(指向右边)或4(指向左边),箭头基座在3。

如果序列是2 3 1,第二个箭头只能用一个螺钉固定在3上,指向左边,因为连续的木板必须重叠。

所有的箭头头部都是相似的,设计师告诉木匠,它们的基部站在不同的垂直线上,底部箭头的左侧也是如此,共同形成1..(N +1)的排列。这就是为什么木匠忽略了细节,只是写下了排列(例如2 6 5 1 4 3)。

给定木匠写下的数字序列,计算可以制作的指示牌数量。由于数字可能非常大,你必须对2147483647取模。序列的第二个整数始终大于第一个整数(底部的箭头总是指向右边)。

输入

第一行有一个整数N,第二行包含从1到N + 1的整数的排列。同一行中的整数之间用一个空格分隔。

输出

输出一行,其中包含给定排列描述的不同标志的数量(对2147483647取模)。

注意

1 ≤ N ≤ 2000


题意

  1. 只需关注箭头长方形部分的头部(靠近三角形)和底部。
  2. 箭头从下往上依次放置。
  3. 第一个箭头的头部和底部题目已经确定,并且头部下标一定大于底部。
  4. 上面的箭头的底部,必须等于下面的箭头的底部,或者等于下面的箭头的头部。
  5. 相邻两个箭头需要有重叠部分,即不能错开。

由此推知

  1. 对于当下箭头而言,上一块箭头的头部和底部很重要。
  2. 上面的箭头的底部可能有多种放法
  3. 题目就是要我们输出有多少种不同的情况。
  4. 要求对输出结果%2147483647。
     

思路(动态规划)

我们用数组s[N+1]记录每一块木块的头部下标。注意:s[0]存储第一块的底部下标

第一步:确定dp数组以及下标的含义

我们需要一个二维dp数组,dp[i][j]表示第i个箭头以j为底时的方案数。

第二步:确定递推公式

3种情况:

  • 第i块的头比上一块的头和尾都小
    dp[i][max(s[i - 1], s[j])] += dp[i - 1][s[j]];
  • 第i块的头比上一块的头和尾都大
     dp[i][min(s[i - 1], s[j])] += dp[i - 1][s[j]]; 
  • 第i块的头在上一块头尾之间
    dp[i][s[i - 1]] += dp[i - 1][s[j]];
    dp[i][s[j]] += dp[i - 1][s[j]];

第三步:dp数组初始化

第一个箭头只有一种放的方法:dp[1][s[1]]=1

遍历每一个箭头时,令dp[i][s[i]]=1,以本身头部为底时为一。结果记得减一

第四步:确定遍历顺序

外循环从第二个箭头开始,内循环遍历上一个箭头所有可能底部。
如果dp[i-1][j]>0,说明上一个箭头存在以该底部放置的方案,方可进入递推。

第五步:结果处理

遍历dp[N],把每一个底部的方案加起来就是结果。


注意事项

  1. long long存储数据。
  2. 最后结果和每次dp变化之后和要取模

C++完整代码

改改再提交乐学,有查重!!

#include <iostream>
#include <vector>
using namespace std;const int MOD = 2147483647;int main() {int N;cin >> N;vector<long long> s(N + 1);for (int i = 0; i <= N; i++) {cin >> s[i];}vector<vector<long long>> dp(N + 1, vector<long long>(2001, 0));dp[1][s[0]] = 1;dp[1][s[1]] = 1;for (int i = 2; i <= N; i++) {for (int j = i - 2; j >= 0; j--) {dp[i][s[i]] = 1;if (dp[i - 1][s[j]] != 0) {if (s[i] > s[i - 1] && s[i] > s[j]) {dp[i][min(s[i - 1], s[j])] += dp[i - 1][ s[j]];dp[i][min(s[i - 1], s[j])] %= MOD;}else if (s[i] <s[i - 1] && s[i] < s[j]) {dp[i][max(s[i - 1], s[j])] += dp[i - 1][s[j]];dp[i][max(s[i - 1], s[j])] %= MOD;}else if ((s[i] <= s[i - 1] && s[i] >= s[j]) || (s[i] >= s[i - 1] && s[i] <= s[j])) {dp[i][s[i - 1]] += dp[i - 1][s[j]];dp[i][s[i - 1]] %= MOD;dp[i][s[j]] += dp[i - 1][s[j]];dp[i][s[j]] %= MOD;}}}}long long res = 0;for (int i = 0; i <= 2000; i++) {res += dp[N][i];res %= MOD;}cout << res-1 << endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/72222.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

lv3 嵌入式开发-7 linux shell脚本编程(分支语句、循环语句)

目录 1 分支语句 2 多路分支语句 3 for的用法 4 while的用法 5 循环控制语句 6 练习 1 分支语句 语法结构: if 表达式then 命令表fi 如果表达式为真, 则执行命令表中的命令; 否则退出if语句, 即执行fi后面的语句。 if和fi是条件语句的语句括号, 必须成对使用; …

C++,day0907

#include <iostream>using namespace std; struct stu { private:int num; private:double score[32];public:void setNum(){cout <<"请输入学生人数:";cin >>num;}void input(){cout<<"请输入学生的成绩:"<<endl;for(int i…

ARM DIY(九)陀螺仪调试

前言 今天调试六轴陀螺仪 MPU6050 硬件 硬件很简单&#xff0c;使用 I2C 接口&#xff0c;并且没有使用中断引脚。 焊接上 MPU6050 芯片和上拉电阻、滤波电容。 检测 MPU6050 是挂在 I2C-0 上的&#xff0c;I2C-0 控制器的驱动已 OK&#xff0c;所以直接使用 I2C-0 检测 …

Linux与shell命令行学习

文章目录 走进shell基本的bash shell命令2.1 遍历目录 cd2.2 查看文件和目录列表 ls2.3 创建文件 touch2.4 复制文件 cp2.5 自动补全 tab2.6 链接文件 ln2.7 文件重命名 mv2.8 删除文件 rm2.9 创建目录 mkdir2.10 删除目录 rmdir2.11 查看文件类型 file2.12 查看整个文件 cat、…

ABAP BAPI_ACC_DOCUMENT_POST 中 EXTENSION1的用法

BAPI_ACC_DOCUMENT_POST 在过账会计凭证时候&#xff0c;经常会发现一些标准字段在参数中并没有 可以通过CMOD/SMOD增强出口--》ACBAPI01--》EXIT_SAPLACC4_001--》ZXACCU15 示例代码&#xff1a; DATA: wa_extension TYPE bapiextc,it_extension TYPE STANDARD TABLE OF ba…

软件工程概述

软件工程概述 软件工程指的是应用计算机科学、数学及管理科学等原理&#xff0c;以工程化的原则和方法来解决软件问题的工程&#xff0c;目的是提高软件生产效率、提高软件质量、降低软件成本。 1. 计算机软件 计算机软件指的是计算机系统中的程序及其文档。程序是计算任务的…

圆圈加数字的css

方式一 .circle { width: 50px; height: 50px; border-radius: 50%; background-color: #f00; color: #fff; text-align: center; line-height: 50px; } .circle::before { content: attr(data-number); display: block; } <div class"circle" data-number"…

C++学习笔记--函数重载(2)

文章目录 1.3、Function Templates Handling1.3.1、Template Argument Deduction1.3.2、Template Argument Substitution 1.4、Overload Resolution1.4.1、Candidate functions1.4.2、Viable functions1.4.3、Tiebreakers 1.5、走一遍完整的流程1.6、Name Mangling1.7、总结 1.…

深度ESP32 PWM教程如何在ESP32 中使用PWM

关于ESP32PWM的简要说明 ESP32 SoC 满载了非常有用的外设&#xff0c;PWM 就是其中之一。是的。ESP32 的芯片中有一个专用的 PWM 硬件模块。脉宽调制或简称PWM是一种成熟且广泛使用的供电技术。 您可以使用 ESP32 的 PWM 来驱动 LED、电机&#xff08;普通直流电机和无刷电机…

qt文件操作

对话框练习 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//字体按钮 void Widget::on_ztbtn_clicked() {//调用QFontDia…

01_Flutter之下拉刷新和上拉加载

一.创建页面 由于我们需要请求网络&#xff0c;并将返回的数据渲染到页面上&#xff0c;所以需要继承StatefulWidget&#xff0c;本文涉及的接口&#xff0c;取自鸿神的玩android开放API class ProjectListPage extends StatefulWidget {overrideState<StatefulWidget>…

js摄像头动态检测

利用摄像头每一秒截图一次图像。然后计算2次图像之间的相似度。 如果相似度低于98%就会报警。 var video document.getElementsByClassName(inputvideo)[0]; video.innerHTML "<video classinput_video idcamera autoplay width640px height380px></video>…

windows10使用wheel安装tensorflow2.13.0/2.10.0

安装过程 安装虚拟环境安装virtualenv安装满足要求的python版本使用virtualenv创建指定python版本的虚拟环境 安装tensorflow2.13.0安装tensorflow-docs直接下载使用wheel下载 在VSCode编辑器中使用虚拟环境下的包 安装虚拟环境 这里笔者使用的是 virtualenv进行虚拟环境搭建的…

VIRTIO-BLK代码分析(2)VIRTIO驱动分析

QEMU模拟的VIRTIO设备同时也是PCIE设备&#xff0c;Guest中VIRTIO PCIE驱动与之匹配&#xff0c;根据设备驱动模型&#xff0c;最终触发probe函数virtio_pci_probe()。该probe函数使能PCIE设备&#xff0c;并注册VIRTIO设备&#xff0c;并与VIRTIO-BLK匹配&#xff0c;触发VIRT…

通俗易懂讲解大模型:Tokenizer

Tokenizer Tokenizer 是 NLP pipeline 的核心组件之一。Tokenizer 的目标是&#xff1a;将文本转换为模型可以处理的数据。模型只能处理数字&#xff0c;因此 Tokenizer 需要将文本输入转换为数字输入。 通常而言有三种类型的 Tokenizer &#xff1a;Word-based Tokenizer、Cha…

2023国赛数学建模A题思路分析 - 定日镜场的优化设计

# 1 赛题 A 题 定日镜场的优化设计 构建以新能源为主体的新型电力系统&#xff0c; 是我国实现“碳达峰”“碳中和”目标的一项重要 措施。塔式太阳能光热发电是一种低碳环保的新型清洁能源技术[1]。 定日镜是塔式太阳能光热发电站(以下简称塔式电站)收集太阳能的基本组件&…

校园二手物品交易系统微信小程序设计

系统简介 本网最大的特点就功能全面&#xff0c;结构简单&#xff0c;角色功能明确。其不同角色实现以下基本功能。 服务端 后台首页&#xff1a;可以直接跳转到后台首页。 用户信息管理&#xff1a;管理所有申请通过的用户。 商品信息管理&#xff1a;管理校园二手物品中…

华为云使用脚本初始化Linux数据盘

初始化新挂载的磁盘 登录云服务器&#xff0c;执行以下命令获取自动初始化磁盘脚本。 wget https://ecs-instance-driver.obs.cn-north-1.myhuaweicloud.com/datadisk/LinuxVMDataDiskAutoInitialize.sh 说明&#xff1a; 若回显异常&#xff0c;请检查云服务器是否绑定弹性公…

029:vue项目,勾选后今天不再弹窗提示

第029个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…