目录

题目描述

思路分析

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

  1. HNU程序设计训练 斯诺克台球(屑题)

    目录 题干 分析 代码 题干 "太长不看" [问题描述] 斯诺克台球是一项古老而又时尚的运动,使用长方形球桌,台面四角以及两长边中心位置各有一个球袋,使用的球分为1个白球,15个红 ...

  2. ACM暑假集训训练总结报告

    为期一个月的ACM暑假集训过去了,想一想,真是光阴似箭,但与以往的不同,没有哀伤,而是满满的充实,这一个月说,不得不累,虽然心里压力没有高三的强,但是时间上基本差不多,每天真的即是三点一线,日复一日. ...

  3. 大一下暑假留校训练记录

    7.24 第一天 周六 上午:开会(介绍赛事) 下午: 1.TC264用的开发环境是ads,严格按照ads的说明书操作.下载程序到MCU不需要像STC那样用ISP,直接用ads里面的一个小黄点. 逐飞 ...

  4. python代码怎么练_Python程序设计训练

    一.目的: 1.掌握建立和执行Python文件的方法: 2.掌握if语句实现分支结构的程序设计方法: 3.掌握for和while语句实现循环结构的程序设计方法: 4.掌握函数的定义和使用方法. 二.内 ...

  5. 2016HUAS暑假集训训练题 F - 简单计算器

    Description 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值.  Input 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符 ...

  6. 【程序设计训练】棋盘

    [问题描述] 棋盘是指一个行和列编号从1~N的NxN的二进制矩阵,当行号和列号之和为偶数时该矩阵对应位置为黑色的(1),否则为白色的(0).以下图示为N=1.2.3时的棋盘. 給出一个NxN的二进制矩 ...

  7. 暑假假期训练总结-3

    上午继续瞅瞅费马定理,以及琢磨Miller-rabin素性测试的代码,觉得课本上的第一个代码,难理解,不如后面的Pollard Rho算法求最大数因子中带的那个容易理解. 下午还是看 Miller-r ...

  8. 暑假假期训练总结-26

    这个,今天的话,主要还是打比赛吧, 当然上午的话,看的状压dp,看的我真的是........ 下午的话,就是这次的五个小时的测试了,开始做题的时候,我们还是非常到位的,我这次也有失误,明明可以一次AC ...

  9. 程序设计训练课程设计

    目录 前言 1 第1章 数据导入功能设计 1 1.1总体功能说明 1 1.2程序分析 1 1.3主要技术说明 2 1.4主要文件代码和程序说明 2 第2章 统计分析设计 7 2.1总体功能说明 7 2 ...

最新文章

  1. Python zip() 函数
  2. ReentrantLock实现原理分析
  3. PAT 1037 在霍格沃茨找零钱(20)(代码+思路)
  4. ZJOI2012网络 题解报告【LCT】
  5. php调http接口,2步教你解决http协议php接口调用
  6. java jsonp_java结合使用Jsonp的例子
  7. 数据不平衡处理_如何处理多类不平衡数据说不可以
  8. 作者:王瑞(1987-),女,中国科学院软件研究所工程师
  9. python epub.js_如何利用Python打包HTML页面为epub?
  10. python---之os.path.split()函数
  11. 推荐一个原型设计工具Balsamiq Mockups
  12. anaconda conda 切换为清华源
  13. SQL常用语句(普通查询+条件查询)
  14. 在html css中加粗显示,HTML和CSS实现字体加粗的三种方法
  15. 华为浏览器工具箱 html修改,华为电子文档浏览器(HedEx Lite)
  16. 精益数据分析 - 第15章 阶段1:移情
  17. libcurl - curl_easy_getinfo - 从 curl 句柄中提取信息 - 可用信息
  18. 阿里云香港服务器速度快吗?
  19. 透过表象看本质!?之多年未填的坑
  20. VMware 中搭建 SylixOS 环境

热门文章

  1. andriod studio 卡在wating for target device to come
  2. CATransform3D 矩阵 m11–m44每个的含义
  3. 微信小程序记录与项目实践
  4. 【复】从0到1的 selenium 爬虫经历
  5. android关于IC卡读写及加密解密
  6. win7设置ipsec_解决win7连接IPsec报错789和809错误
  7. Unity 雨水滴到屏幕效果
  8. 计算机x线平扫对人健康有影响吗,X线检查-医学影像频道-家庭医生在线 第16页...
  9. 《圣经》中最让人感动的十句话(转)
  10. 在王者荣耀角度下分析面向对象程序设计B中23种设计模式之策略模式