动态规划 妖狐艹你老母 2022-05-11 04:56 280阅读 0赞 1.**题目:**最长递增子序列(Longest Increasing Subsequence) **问题描述:** > 给定长度为N的数组A,计算A的最长单调递增的子序列(不一定连续)。如给定数组A\{5,6,7,1,2,8\},则A的LIS为\{5,6,7,8\},长度为4. **原理:** > 因为子序列要求是递增的,所以重点是子序列的起始字符和结尾字符,因此我们可以利用结尾字符。 > > 分解问题: > > 1. 初始化为1,即只输入一个数值; > > 2.在当前位置(从第二个数值开始),如果当前数值大于之前任意的值,则当前的最大长度加1,小于则不操作; > > 举例子 > > <table style="width:693px;"> > <tbody> > <tr> > <td>输入数值</td> > <td style="width:78px;">1</td> > <td style="width:84px;">3</td> > <td style="width:89px;">5</td> > <td style="width:102px;">7</td> > <td style="width:80px;">3</td> > <td style="width:93px;">4</td> > </tr> > <tr> > <td>对应位置的字符串长度a</td> > <td style="width:78px;">1</td> > <td style="width:84px;">2</td> > <td style="width:89px;">3</td> > <td style="width:102px;">4</td> > <td style="width:80px;">2</td> > <td style="width:93px;">3</td> > </tr> > <tr> > <td>备注(加的左值为之前长度最大值)</td> > <td style="width:78px;">初始肯定为1</td> > <td style="width:84px;">3>1,故a=1+1</td> > <td style="width:89px;">5>1且5>3,故2+1</td> > <td style="width:102px;"> <p>7>1</p> <p>7>2</p> <p>7>3</p> <p>3+1</p> </td> > <td style="width:80px;"> <p>3>1</p> <p>3=3</p> <p>3<5</p> <p>3<7</p> <p>故</p> <p>1+1</p> </td> > <td style="width:93px;"> <p>..</p> <p>4>3</p> <p>...</p> <p>4>3</p> <p>故</p> <p>2+1</p> </td> > </tr> > </tbody> > </table> > > 注意:主要对每个值得最大长度计算、之前端点最大值的判断,全局端点的最大值判断 #include<iostream> #include<algorithm> #include<vector> using namespace std; int maxlength(vector<int> numbers,int n) { int result = 0; vector<int> arr; //初始化很重要 int temp = n; while (temp--) arr.push_back(0); arr[0] = 1; //动态规划初始条件,用于记录当前位置的最大字符串长度** for (int i = 1; i < n; i++) //表示当前端点开始,记录每个端点的最大字符串长度 { int max = 0; //最大字符串长度,每一轮都重新赋值*** for (int j = 0; j <i; j++) //表示当前端点左边遍历,使其得到最大字符串紧邻的字符,并记录当前的长度 { if ((numbers[i] > numbers[j]) && (arr[j] > max))//当前大于其之前端点且之前的端点的的最大长度大于原先的最大长度,则重新设置最大长度 { //即,取得之前端点最大长度的大小,给max max = arr[j]; } } arr[i] = max + 1; //当全部扫描完之前的端点,加1获得当前节点大小 if (arr[i] > result) //获得所有最大的长度值 result = arr[i]; } return result; } int main() { int n; while (cin >> n) { int a = 0; vector<int> numbers; for (int i = 0; i < n; i++) { cin >> a; numbers.push_back(a); } cout << maxlength(numbers, n) << endl; } system("pause"); return 0; }
相关 动态规划 一:概念: 和分冶法相似,不同之处在于前者是把问题划分为互不相交的子问题,而动态规划会出现子问题重叠的情况。通常用来求解最优化问题。。 基本步骤: ①:刻画一个最优 我就是我/ 2022年12月01日 11:51/ 0 赞/ 25 阅读
相关 动态规划 -------------------- 动态规划的设计思想 动态规划(DP)\[1\]通过分解成子问题解决了给定复杂的问题,并存储子问题的结果,以避免再次计算相同的结 柔情只为你懂/ 2022年09月25日 11:15/ 0 赞/ 255 阅读
相关 动态规划 作者:Hawstein 出处: [http://hawstein.com/posts/dp-novice-to-advanced.html][http_hawstein.c 淡淡的烟草味﹌/ 2022年09月24日 12:17/ 0 赞/ 204 阅读
相关 动态规划 1. 首先,动态规划不是一个特定的算法,它代表的是一种思想,一种手段 2. 动态规划方法往往用于求解“最优化问题”,能用动态规划求解的问题的前提是问题具有“最优子结构性质” 刺骨的言语ヽ痛彻心扉/ 2022年07月29日 11:46/ 0 赞/ 94 阅读
相关 动态规划 首先是概念:动态规划就是将原问题划分为简单的几个小问题(有点类似与分治法?但是分治法中的各个小问题是相互独立的,彼此之间不会产生影响,但是动态规划中所得的值和前面相关,当前的解 青旅半醒/ 2022年07月12日 05:01/ 0 赞/ 317 阅读
相关 动态规划 > 给定两个字符串A和B,返回两个字符串的最长公共子序列的长度。例如,A=”1A2C3D4B56”,B=”B1D23CA45B6A”,”123456”或者”12C4B6”都是最 以你之姓@/ 2022年06月07日 00:41/ 0 赞/ 312 阅读
相关 动态规划 基本思想: 动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。 区别: 与 ゞ 浴缸里的玫瑰/ 2022年05月25日 09:44/ 0 赞/ 447 阅读
相关 动态规划 等我有时间了,一定要把《算法导论》啃完,这本书的印刷质量实在太好了,就是烧脑子,滑稽。 适合应用动态规划求解的最优化问题应该具备两个要素: 最优子结构:一个问题的最优解包含 短命女/ 2022年05月17日 09:45/ 0 赞/ 325 阅读
相关 动态规划 1.题目:最长递增子序列(Longest Increasing Subsequence) 问题描述: > 给定长度为N的数组A,计算A的最长单调递增的子序列(不一定连续) 妖狐艹你老母/ 2022年05月11日 04:56/ 0 赞/ 281 阅读
相关 动态规划 算法题中动态规划是真的难,写一篇总结,彻底解决动态规划。参考:[https://blog.csdn.net/u013309870/article/details/7519359 左手的ㄟ右手/ 2021年11月19日 14:14/ 0 赞/ 494 阅读
还没有评论,来说两句吧...