蓝桥杯22年第十三届省赛-数组切分|线性DP

2024-04-07 21:44

本文主要是介绍蓝桥杯22年第十三届省赛-数组切分|线性DP,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接:

蓝桥杯2022年第十三届省赛真题-数组切分 - C语言网 (dotcpp.com)

 1.数组切分 - 蓝桥云课 (lanqiao.cn)

这道题C语言网数据会强一些。 

 说明:

对于一个切分的子数组,由于数组是1-N的一个排列,所以每个数唯一 可以用子数组最大值-最小值==子数组长度-1(子数组右端点索引 -左端点索引+1-1)来判断 。
  
 尝试题目求什么,我们就设dp数组为 什么,那么设f[i]为 前i个数能有f[i]种方案, 
 观察样例,手工计算, A=1,3,2,4 
 i为1时,方案为 : 
 {1} 
 i为2时,方案为: 
  {1}{3}    而{1,3}不行   
 i为3时,方案为 :
 {1}{3}{2},{1}{3,2},{1,3,2} 而{1,3}{2}不行   
 i为4时,方案为:
  {1}{3}{2}{4},{1}{3,2}{4},{1,3,2}{4} ,{1}{3,2,4},{1,3,2,4} 
  而{1}{3}{2,4},{1,3}{2}{4}不行 
  
  发现当加入第i个数是时,如果把第j个数和第i个数划成一组,如果这个划分合法,
  那么他就能和f[j-1] 的每个方案 组合成 合法方案,于是累加上[j,i]划分合法时每个
  f[j-1]就是f[i]的值 。


 注意:如果1到i所有数在一个切分里能组成合法的区间,这时的j-1为0 ,故初始化f[0]=1

在c语言网用scanf输入,才能ac,用cin有一个测试点过不了。

代码:

#include <bits/stdc++.h>
//#define int long long
using namespace std;
const int N=1e5+10;/*对于一个切分的子数组,由于数组是1-N的一个排列,所以每个数唯一可以用子数组最大值-最小值==子数组长度-1(子数组右端点索引-左端点索引+1-1)来判断 尝试题目求什么,我们就设dp数组为 什么,那么设f[i]为 前i个数能有f[i]种方案, 观察样例,手工计算, A=1,3,2,4 i为1时,方案为 : {1} i为2时,方案为: {1}{3}    而{1,3}不行   i为3时,方案为 :{1}{3}{2},{1}{3,2},{1,3,2} 而{1,3}{2}不行   i为4时,方案为:{1}{3}{2}{4},{1}{3,2}{4},{1,3,2}{4} ,{1}{3,2,4},{1,3,2,4} 而{1}{3}{2,4},{1,3}{2}{4}不行 发现当加入第i个数是时,如果把第j个数和第i个数划成一组,如果这个划分合法,那么他就能和f[j-1] 的每个方案 组合成 合法方案,于是累加上[j,i]划分合法时每个f[j-1]就是f[i]的值 。注意:如果1到i所有数在一个切分里能组成合法的区间,这时的j-1为0 ,故初始化f[0]=1*/int a[N]; 
//表示前i个数能有f[i]种切分方法 
int f[N]; 
int mod=1000000007;
int n;
int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>n;for(int i=1;i<=n;i++){//	cin>>a[i];//开long long 之后 用scanf格式控制符要用lld//用scanf要关掉上面的ios语句 scanf("%d",&a[i]); }//需要初始化0处为1,因为如果1到i所有数在一个切分里能组成合法的区间//这时的j-1为0 ,故f[0]=1f[0]=1;f[1]=1;for(int i=2;i<=n;i++){//序列最小值减最大值等于序列长度-1,即为自然数 int ma=a[i],mi=a[i];for(int j=i;j>=1;j--){//维护最值 ma=max(ma,a[j]),mi=min(mi,a[j]);if(ma-mi==i-j){f[i]=(f[i]+f[j-1])%mod;}}}cout<<f[n];return 0;
}

这篇关于蓝桥杯22年第十三届省赛-数组切分|线性DP的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/883748

相关文章

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA

JAVA数组中五种常见排序方法整理汇总

《JAVA数组中五种常见排序方法整理汇总》本文给大家分享五种常用的Java数组排序方法整理,每种方法结合示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录前言:法一:Arrays.sort()法二:冒泡排序法三:选择排序法四:反转排序法五:直接插入排序前言:几种常用的Java数组排序

Java数组初始化的五种方式

《Java数组初始化的五种方式》数组是Java中最基础且常用的数据结构之一,其初始化方式多样且各具特点,本文详细讲解Java数组初始化的五种方式,分析其适用场景、优劣势对比及注意事项,帮助避免常见陷阱... 目录1. 静态初始化:简洁但固定代码示例核心特点适用场景注意事项2. 动态初始化:灵活但需手动管理代

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

C++原地删除有序数组重复项的N种方法

《C++原地删除有序数组重复项的N种方法》给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度,不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(... 目录一、问题二、问题分析三、算法实现四、问题变体:最多保留两次五、分析和代码实现5.1、问题分析5.

Java中数组转换为列表的两种实现方式(超简单)

《Java中数组转换为列表的两种实现方式(超简单)》本文介绍了在Java中将数组转换为列表的两种常见方法使用Arrays.asList和Java8的StreamAPI,Arrays.asList方法简... 目录1. 使用Java Collections框架(Arrays.asList)1.1 示例代码1.

python中列表list切分的实现

《python中列表list切分的实现》列表是Python中最常用的数据结构之一,经常需要对列表进行切分操作,本文主要介绍了python中列表list切分的实现,文中通过示例代码介绍的非常详细,对大家... 目录一、列表切片的基本用法1.1 基本切片操作1.2 切片的负索引1.3 切片的省略二、列表切分的高

C++一个数组赋值给另一个数组方式

《C++一个数组赋值给另一个数组方式》文章介绍了三种在C++中将一个数组赋值给另一个数组的方法:使用循环逐个元素赋值、使用标准库函数std::copy或std::memcpy以及使用标准库容器,每种方... 目录C++一个数组赋值给另一个数组循环遍历赋值使用标准库中的函数 std::copy 或 std::

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::