HNU暑假程序设计训练 0419
目录
题目描述
思路分析
AC代码
深入思考
题目描述
给出一个由n个正整数组成的数组。您的任务是找到给定数组的递增子数组的最大长度。
递增子数组由数组中若干个连续元素组成,且子数组中的每个元素严格地大于前一个元素。
【输入形式】
第一行为一个正整数n(1≤n≤),表示数组元素的个数
第二行给出n个正整数a1 a2......an (1≤ai≤) ,整数之间使用空格分隔
【输出形式】
输出最大递增子数组的长度
【样例输入】
5
1 7 2 11 15
【样例输出】
3
【样例说明】
1 7可以构成一个递增子数组
2 11 15可以构成一个递增子数组
所以本样例的输出结果为3
思路分析
直接采用穷举法,二重循环遍历,时间复杂度为O()。
设一个数组int arr:
0 | 1 | 2 | 3 | 4 |
1 | 7 | 2 | 11 | 5 |
设整型变量cnt=1(任意长度大于0数组的最长连续递增子序列最小长度为1),记录当前子数组最长连续递增子序列的长度。子数组分割方法如下:
第一次 | arr[0],arr[1],arr[2],arr[3],arr[4] | cnt=2 |
第二次 | arr[1],arr[2],arr[3],arr[4] | cnt=1 |
第三次 | arr[2],arr[3],arr[4] | cnt=3 |
第四次 | arr[3],arr[4] | cnt=1 |
第五次 | arr[4] | cnt=1 |
最终结果输出3。
AC代码
#include <iostream>
#include<stdio.h>
using namespace std;
int arr[100000]={0};
int main()
{int n;cin >> n;for(int i=0;i<n;i++){scanf("%d",&arr[i]);}int Max=0;for(int i=0;i<n;i++){int cnt=1;for(int j=i;j<n-1;j++){if(arr[j]<arr[j+1]){cnt++;}else{break;}}if(cnt>Max)//取所有cnt中的最大值{Max=cnt;}}printf("%d\n",Max);
}
深入思考
其实这题是一个典型的动态规划问题的变式。
动态规划基本知识:
动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,有些子问题被重复计算了很多次。如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。我们可以用一个表来记录所有已解的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。这就是动态规划法的基本思路。具体的动态规划算法多种多样,但它们具有相同的填表格式。
动态规划算法跟数组有着密切的关系,因此推荐大家在分析动态规划的算法时画一张表格(建议使用excel)分析解决问题往往能够事半功倍。
(引自 CSDN博主「静笃归心方得平和心气]
原文链接:https://blog.csdn.net/weixin_42182348/article/details/90814032)
最大递增子数组问题(不要求连续)
给定数组arr,返回arr的最长递增子序列(Longest increasing subsequence,LIS)的长度,比如arr=[2,1,5,3,6,4,8,9,7],最长递增子序列为[1,3,4,8,9]返回其长度为5。
那么,这个问题怎么用动态规划法求解呢?
设f[i]表示必须以arr[i]结尾的所有子数组的LIS。要计算f[i],就要考察i之前的所有位置(0到i-1,这就是代码内层for的控制变量j的变化范围),找到最大的f[j]。f[j]代表以arr[j]结尾的子数组中最大递增子序列的长度。
注意到,由于它是递增的,因此arr[j]就是子序列的最大值。如果arr[i]比arr[j]还大,那就一定大于该序列中的其他数,能够构成一个长度+1的LIS。这就是if中的第一个条件的来源。
第二个条件是为了保证更新f[i]的结果是得到更大的f[i]值。说起来不太直观,请看下表。
序号i | 0 | 1 | 2 | 3 | 4 | ... |
arr[i] | 11 | 13 | 19 | 5 | 21 | ... |
f[i] | 1 | 2 | 3 | 1 | ? | ... |
此刻i=4。假设没有if中的第二个条件(f[i]<f[j]+1),求f[4]的详细过程为:
j | 0 | 1 | 2 | 3 |
f[4] | 2 | 3 | 4 | 2 |
arr[0]<arr[4] f[4]=f[0]+1=2
arr[1]<arr[4] f[4]=f[1]+1=3
arr[2]<arr[4] f[4]=f[2]+1=4
arr[3]<arr[4] 但是此时f[3]=1,f[4]=4(见上一行), 不满足f[i]<f[j]+1。更新后 f[4]=f[3]+1=2(反而变小了)
而带上(f[i]<f[j]+1)这个条件的话,j=3这次循环就不会更新f[4]的值,最终算出f[4]的正确值为4。
代码
#include <iostream>
#include<stdio.h>
using namespace std;
int arr[100000]={0};
int f[100000]={0};//记录子数组的LIS。
int main()
{int n;cin >> n;for(int i=0;i<n;i++){cin >> arr[i];f[i]=1;//初始化}int Max=0;//记录以不同元素结尾的子数组的LIS的最大值。for(int i=1;i<n;i++){for(int j=0;j<i;j++){if((arr[j]<arr[i])&& (f[i]<f[j]+1)){f[i]=f[j]+1;//f[i]记录了必须以arr[i]结尾时所有子数组的LIS。}}if(f[i]>Max){Max=f[i];}}cout << Max << endl;return 0;
}
HNU暑假程序设计训练 0419相关推荐
- HNU程序设计训练 斯诺克台球(屑题)
目录 题干 分析 代码 题干 "太长不看" [问题描述] 斯诺克台球是一项古老而又时尚的运动,使用长方形球桌,台面四角以及两长边中心位置各有一个球袋,使用的球分为1个白球,15个红 ...
- ACM暑假集训训练总结报告
为期一个月的ACM暑假集训过去了,想一想,真是光阴似箭,但与以往的不同,没有哀伤,而是满满的充实,这一个月说,不得不累,虽然心里压力没有高三的强,但是时间上基本差不多,每天真的即是三点一线,日复一日. ...
- 大一下暑假留校训练记录
7.24 第一天 周六 上午:开会(介绍赛事) 下午: 1.TC264用的开发环境是ads,严格按照ads的说明书操作.下载程序到MCU不需要像STC那样用ISP,直接用ads里面的一个小黄点. 逐飞 ...
- python代码怎么练_Python程序设计训练
一.目的: 1.掌握建立和执行Python文件的方法: 2.掌握if语句实现分支结构的程序设计方法: 3.掌握for和while语句实现循环结构的程序设计方法: 4.掌握函数的定义和使用方法. 二.内 ...
- 2016HUAS暑假集训训练题 F - 简单计算器
Description 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. Input 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符 ...
- 【程序设计训练】棋盘
[问题描述] 棋盘是指一个行和列编号从1~N的NxN的二进制矩阵,当行号和列号之和为偶数时该矩阵对应位置为黑色的(1),否则为白色的(0).以下图示为N=1.2.3时的棋盘. 給出一个NxN的二进制矩 ...
- 暑假假期训练总结-3
上午继续瞅瞅费马定理,以及琢磨Miller-rabin素性测试的代码,觉得课本上的第一个代码,难理解,不如后面的Pollard Rho算法求最大数因子中带的那个容易理解. 下午还是看 Miller-r ...
- 暑假假期训练总结-26
这个,今天的话,主要还是打比赛吧, 当然上午的话,看的状压dp,看的我真的是........ 下午的话,就是这次的五个小时的测试了,开始做题的时候,我们还是非常到位的,我这次也有失误,明明可以一次AC ...
- 程序设计训练课程设计
目录 前言 1 第1章 数据导入功能设计 1 1.1总体功能说明 1 1.2程序分析 1 1.3主要技术说明 2 1.4主要文件代码和程序说明 2 第2章 统计分析设计 7 2.1总体功能说明 7 2 ...
最新文章
- Python zip() 函数
- ReentrantLock实现原理分析
- PAT 1037 在霍格沃茨找零钱(20)(代码+思路)
- ZJOI2012网络 题解报告【LCT】
- php调http接口,2步教你解决http协议php接口调用
- java jsonp_java结合使用Jsonp的例子
- 数据不平衡处理_如何处理多类不平衡数据说不可以
- 作者:王瑞(1987-),女,中国科学院软件研究所工程师
- python epub.js_如何利用Python打包HTML页面为epub?
- python---之os.path.split()函数
- 推荐一个原型设计工具Balsamiq Mockups
- anaconda conda 切换为清华源
- SQL常用语句(普通查询+条件查询)
- 在html css中加粗显示,HTML和CSS实现字体加粗的三种方法
- 华为浏览器工具箱 html修改,华为电子文档浏览器(HedEx Lite)
- 精益数据分析 - 第15章 阶段1:移情
- libcurl - curl_easy_getinfo - 从 curl 句柄中提取信息 - 可用信息
- 阿里云香港服务器速度快吗?
- 透过表象看本质!?之多年未填的坑
- VMware 中搭建 SylixOS 环境
热门文章
- andriod studio 卡在wating for target device to come
- CATransform3D 矩阵 m11–m44每个的含义
- 微信小程序记录与项目实践
- 【复】从0到1的 selenium 爬虫经历
- android关于IC卡读写及加密解密
- win7设置ipsec_解决win7连接IPsec报错789和809错误
- Unity 雨水滴到屏幕效果
- 计算机x线平扫对人健康有影响吗,X线检查-医学影像频道-家庭医生在线 第16页...
- 《圣经》中最让人感动的十句话(转)
- 在王者荣耀角度下分析面向对象程序设计B中23种设计模式之策略模式