27.方向标

news2025/2/27 12:18:54

题目

描述

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

序列(有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.coloradmin.cn/o/990425.html

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

相关文章

达梦数据库MAIN表空间导致磁盘满问题的处理和总结

前言 在达梦数据库使用中&#xff0c;建议对数据库表空间使用进行规划&#xff0c;业务用户创建单独的表空间使用。 如果不创建单独的用户表空间会遇到什么问题呢&#xff1f;通过下面的问题和测试说明合理的表空间规划是有必要的。 问题 某开发项目组使用DM8 1-2-192 版本。…

Window安装Node.js npm appium Appium Desktop

Window安装Node.js npm appium appium Desktop 1.安装nodejs 参考链接&#xff1a; https://blog.csdn.net/weixin_42064877/article/details/131610918 1)打开浏览器&#xff0c;并前往 Node.js 官网 https://nodejs.org/ ↗。 2)在首页中&#xff0c;您可以看到当前 Node.…

解决防火墙导致虚拟机不能ping通宿主机的问题

今天&#xff0c;无缘无故的&#xff0c;虚拟机突然用不了&#xff0c;网络连上不了&#xff0c;一番折腾翻找&#xff0c;最后才发现&#xff0c;是因为虚拟机ping不同宿主主机了&#xff0c;连网关都ping不通了&#xff0c;但是&#xff0c;宿主主机却可以ping通虚拟机 。 最…

工程管理系统简介 工程管理系统源码 java工程管理系统 工程管理系统功能设计

鸿鹄工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离构建工程项目管理系统 1. 项目背景 一、随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性&#xff0c;公司对内部工程管…

Netty(一)NIO-基础

Netty 分布式根基于网络编程&#xff0c;Netty恰是java网络编程的王者&#xff0c;致力于高性能编程。 前置 适用于网络开发&#xff0c;服务器开发。多线程&#xff0c;线程池&#xff0c;maven。 大纲 NIO编程&#xff08;Selector&#xff0c;ByteBuffer和Channel&…

即拼七人拼团系统开发模式,如何助力电商平台提升产品销量和复购率?

对于电商平台来说&#xff0c;如何提高产品销量和复购率&#xff0c;是每个其他都在面临的最大挑战。而应对这个挑战最好的方法就是结合一款合适的商业模式&#xff0c;一个姓王的客户就运用即拼七人拼团模式&#xff0c;成功提升了产品销量和复购率。 这个王客户运营的电商平台…

全栈自主可控!移动云边缘智能小站EIS新突破

8月中旬&#xff0c;移动云为福建泉州惠安某储能制造公司打造的边缘智能小站EIS正式上线。该项目是中国移动首个正式上线的软硬一体、全栈自主可控的超融合边缘智能小站项目。 边缘智能小站&#xff08;EIS&#xff0c;Edge Intelligence Site&#xff09;是基于移动云边缘超融…

Unity的UI面板基类

使用这个组件实现淡入淡出 public abstract class BasePanel : MonoBehaviour {//控制面板透明度 用于淡入淡出private CanvasGroup canvasGroup;//淡入淡出速度private float alphaSpeed 10;//隐藏还是显示public bool isShow false;//隐藏完毕后做的事private UnityAction …

中秋国庆双节将至,企业如何进行软文推广?

节点营销是每个企业都会面临的课题&#xff0c;中秋国庆双节将至&#xff0c;这两个节日不仅是人们消费的高峰期&#xff0c;也是各大企业通过节日营销提高品牌知名度和美誉度的最佳时机&#xff0c;节点营销的方式之一就是软文推广&#xff0c;那么企业应该如何利用双节来进行…

【ccf-csp题解】第1次csp认证-第四题-无线网络-特殊点个数限制的单源最短路径

题目描述 思路讲解 可以把题目抽象为&#xff1a;从第1个点到第2个点&#xff0c;经过特殊点的数量不超过k的单源最短路径&#xff08;其中每条边的权重均为1&#xff09; 可以使用bfs解决这个问题&#xff0c;但是dist[][]数组和队列中放置的pair<int,int>元素不再是单…

Python web 框架web.py「简约美」

web.py is a web framework for Python that is as simple as it is powerful. web.py is in the public domain, you can use it for whatever purpose with absolutely no restrictions. web.py 是一个简单而强大的 Python Web 框架。web.py 属于公共领域&#xff0c;您可以…

VBA系列技术资料1-177

MF系列VBA技术资料 为了让广大学员在VBA编程中有切实可行的思路及有效的提高自己的编程技巧&#xff0c;我参考大量的资料&#xff0c;并结合自己的经验总结了这份MF系列VBA技术综合资料&#xff0c;而且开放源码&#xff08;MF04除外&#xff09;&#xff0c;其中MF01-04属于定…

外贸B2B建站怎么做?

答案是&#xff1a;外贸B2B建站可以用Wordpress来建站。 外贸企业在开展国际业务时&#xff0c;B2B网站的作用不可忽视。 它不仅展示了企业的实力和产品&#xff0c;还帮助企业建立起与潜在客户的联系。 如何打造一个有效的外贸B2B网站呢&#xff1f;本文将为您提供详细的建…

FPGA实现Cordic算法——向量模式

FPGA实现Cordic算法——向量模式 FPGA实现Cordic算法——向量模式1.cordic算法基本原理2.FPGA实现cordic算法向量模式i、FPGA串行实现cordicii、FPGA流水线实现cordiciii、实验结果 FPGA实现Cordic算法——向量模式 1.cordic算法基本原理 FPGA中运算三角函数&#xff0c;浮点数…

直播 | 丹望医疗王晓林博士“基于微流控的血管化器官/类器官芯片构建及其应用”

类器官模型具有高仿真性&#xff0c;与人体器官有高度相似的组织学特征和功能&#xff0c;尤其在肿瘤模型中能够较好保留肿瘤异质性等优势&#xff0c;在精准医疗及药物筛选等领域具有广泛的应用前景。同时&#xff0c;基于微流控技术的器官芯片能在微流体装置上实现多重微环境…

了解测试划分

界面测试 肉眼直观看到的,都属于界面,例如 WEB站(通过浏览器打开的网站),APP,小程序,公众号 界面的重要性:用户和软件交流的时候,通常都是通过界面进行交互的 业界测试界面的时候,参考软件规格说明书,UI视觉稿 可靠性测试 可靠性 正常运行时间/(正常运行时间非正常运行时…

Web3新品牌ZAN亮相外滩大会 为海外客户提供全栈安全可信技术

9月8日上午&#xff0c;Web3品牌ZAN在外滩大会正式发布&#xff0c;为香港及海外市场提供面向Web3的技术解决方案&#xff0c;尤以安全合规类技术产品为主。原蚂蚁链CTO张辉担任ZAN CEO。 张辉介绍&#xff0c;ZAN面向香港及海外市场的合规机构及创新型公司&#xff0c;提供支持…

陪诊系统|陪诊软件开发|陪诊系统搭建功能

为了顺应不断变化的市场需求&#xff0c;有些行业慢慢销声匿迹&#xff0c;有些行业刚刚崭露头角&#xff0c;目前陪诊的市场需求也在逐渐扩大&#xff0c;陪诊小程序也随之到来&#xff0c;主要面向独居老人&#xff0c;孕妇&#xff0c;残障人士等等给予专业性的陪诊就医服务…

U盘提示有写保护,处理方式

第一步&#xff1a; 下载ChipGenius&#xff0c;检测U盘的主控产商和型号 主控厂家&#xff1a;安国&#xff0c;主控型号&#xff1a;AU6989SN-GTD 第二步&#xff1a; 根据主控产商和型号,在https://www.upantool.com/liangchan/Alcor/上找到符合型号的量产工具&#xff…

3D模型格式转换工具HOOPS Exchange与CAD Exchanger的对比分析

选择CAD数据转换SDK是一个复杂的过程&#xff0c;错误的决定可能会浪费大量的时间和开发资源。在这个领域&#xff0c;HOOPS Exchange和CAD Exchanger代表了CAD数据转换过程中的两个截然不同的选项。今天我们将其做一组对比分析&#xff0c;希望能对您有所帮助~ 一、HOOPS Exc…