个人笔记:算法讲座3.1——地精的帽子(最长上升子序列)
本文仅供参考学习使用,谢谢
目录
- 问题描述:
- 分析思路:
- 算法描述:
- 测试数据:
问题描述:
Alice和Bob抓住了一些地精,用魔法把它们栓在了一根长长的竹竿上,每个地精都戴着不同颜色的帽子,而且身高都不相同。Alice和Bob站在竹竿的起始端,他们两个在争执,如果放掉一些地精,最多能看到几种颜色的帽子,你能帮助他们么?
- 输入:
第一行是地精的数量,第二行是从起始端开始每个地精的身高。
- 输出:
去掉一些地精后,能看到帽子颜色的最大值。
分析思路:
- First
若想用动态规划思想求一串数字的 最长上升子序列的 长度,可以将先将问题分解为求以第i个数(i=1,2,3…)为终点的 最长子序列长度。然后得出最长的那一个即为 最长上升子序列长度
- Second
先从第一个数字开始 一个数字固然有序且为上升子序列,所以长度为1
从第二个开始需要遍历前面的所有数字的 最长上升子序列长度 选出最长的那一个长度 在此处为1,
如果第二个数字大于第一个数字则 以第二个数字为终点的最长上升子序列的 长度为前一个数字的最长子序列长度(此处为1)+1
- Third
以此类推 以第n个数字为终点的 最长子序列长度 可以分为两种情况:
如果第n个数字大于第n-1个数字 那么 以第n个数字为终点的 最长子序列长度为 为前面n-1个最长子序列长度的最大值+1
如果第n个数字不大于第n-1个数字 那么 最长子序列长度为 为前面n-1个最长子序列长度的最大值
算法描述:
输入n个数字后先生成一个一维数组用来存储这n个数字 然后在生成一个一维数组来记录 以第n个数字为终点的 最长子序列长度使用双重for循环,第一层for循环遍历存储每一个以第n个数字为终点的 最长子序列长度,第二层for循环用来判断前面n-1个数字的最长子序列长度的最大值,第n个 分情况处理取得最大值存放完所有最长子序列长度之后遍历这个数组得出最大值即为所求
测试数据:
- 数据1:
8
15 76 21 88 43 32 40 68
- 测试结果:
5
#include <stdio.h>
#define maxsize 100//从1开始放入数据
int high[maxsize];
int maxlen[maxsize];int gethigh(int i){int max=high[1];for (int n=2; n<=i; n++)if (max<high[i])max=high[i];return max;
}int getmaxlen(int i){int max=1;for (int n=2; n<=i; n++)if (max<maxlen[i])max=maxlen[i];return max;
}int f(int i){int len=gethigh(i);if (i==1 || len > high[i] ) {return 1;} else {return getmaxlen(i)+1;}
}void workout(int N){for (int i=1; i<=N; i++) {maxlen[i]=f(i);}int max=getmaxlen(N);printf("%d\n",max);}int main(int argc, const char * argv[]) {int number=0;scanf("%d",&number);for (int i=1; i<=number; i++) {scanf("%d",&high[i]);maxlen[i]=1;}workout(number);return 0;
}
个人笔记:算法讲座3.1——地精的帽子(最长上升子序列)相关推荐
- 【常见笔试面试算法题12续集三】动态规划算法案例分析3 LIS练习题(最长上升子序列)
学习交流加 个人qq: 1126137994 个人微信: liu1126137994 学习交流资源分享qq群: 962535112 这是一个经典的LIS(即最长上升子序列)问题,请设计一个尽量优的解法 ...
- 【动态规划刷题笔记】线性dp:合唱队形(最长递增子序列的变体)
[NOIP2004 提高组] 合唱队形 - 洛谷 思路:最少出列,即挑出最多,即找最长递增子序列和最长递减子序列 设dp1[i]为以h[i]结尾的最长递增子序列 dp2[i]为以h[i]开头的最长递减 ...
- Python算法之旅元组的风暴之最长上升子序列
元组的风暴之最长上升子序列 小美:还记得我们上次做的那道题目吗?求最长连续递增子序列的长度. 阿福:记得啊,当时我们用了两种方法,分别是在a[i] <=a[i-1]和a[i] > a[i- ...
- 菜鸟学Linux 第044篇笔记 算法和私有CA
菜鸟学Linux 第044篇笔记 算法和私有CA 证书吊销列表CRL(Certificate Revocation List ) 如何解决私钥丢失 PKI: Public Key Infrastruc ...
- 两个字符串的最长公共子序列长度_算法学习笔记(58): 最长公共子序列
(为什么都更了这么多篇笔记了,这时候才讲这么基础的内容呢?因为我本来以为LCS这种简单的DP不用讲的,结果CF不久前考了LCS的变式,然后我发现由于自己对LCS一点都不熟,居然写不出来 ,于是决定还是 ...
- 读书笔记 -- 算法入门
14天阅读挑战赛 努力是为了不平庸~ 算法学习有些时候是枯燥的,这一次,让我们先人一步,趣学算法!欢迎记录下你的那些努力时刻(算法学习知识点/算法题解/遇到的算法bug/等等),在分享的同时加深对于算 ...
- 算法知识之最长公共子序列问题(动态规划)
最近朋友让帮做个关于动态规划的最长公共子序列的问题,翻看以前的笔记并完成该题后,顺便写这样一篇文章,希望对大家有所帮助,同时也帮助自己回顾该知识点. 一.最长公共子序列的定义 子序列:若给定序列X={ ...
- 【算法】最长公共子序列(LCS)
1. 概述 题目描述:给定两个字符串(或数字序列)A和B,求一个字符串,使得这个字符串是A和B的最长公共部分(子序列可以是补连续的) 例如:"sadstory" 和 "a ...
- 【算法】最长递增子序列问题
1.问题描述 有一个序列 A = [18, 17, 19, 6, 11, 21, 23, 15],求出最长递增子序列的个数. 2.算法描述 该问题解唯一,但解的形式不唯一.譬如,该问题最长递增子序列的 ...
最新文章
- 《数学建模:基于R》一一2.2 方差分析
- count http://www.cplusplus.com/reference/algorithm/count/
- winsock setsockopt 详解
- 深度学习之四:常用模型和方法
- 粗暴,干就完了----徐晓冬似的C语言自学笔记-----实现一个链表结构
- tabulate matlab,matlab中用于统计矩阵数据频率,出现次数的函数
- 最重要的7个Drupal内核模板文件
- java学习二---对象和内存管理
- redis mysql 集群_Redis(五)、Redis数据库集群相关
- android app 尺寸,Android APP标注尺寸入门教程和app标注工具
- 笔记之PWM暂停输出,保持低电平问题
- 防火墙之firewalld
- ExcelVBA批量添加PDF文件
- php phpexcel 内容靠最右边_PHPExcel的使用小结,不够全面,只是应对当前我用到的地方做了笔记,日后再有新的需求还会随时修改...
- 下载追踪:如何监测APP的来源渠道数据
- Python之禅——传说中的蛇宗总纲
- 迎战618大促 京东技术大“阅兵”
- SSM研究生推免网站
- raft partd 日志压缩 部署指导
- Altium Designer 20 原理图和PCB网络颜色分配