【原】最长上升子序列——动态规划

简介:
这个是用动态规划做的一道题,先学习一下动态规划的概念吧。  
   用动态规划解题,就是要把问题分解为一个个子问题,对子问题进行求解,而子问题又可以继续进行分解,直到一定小的规模。
   DP与递归类似,但递归会导致重复计算,而用DP每次计算后的子问题的解都会被保存起来,从而避免了重复计算,保证了效率,比如本题用maxlen[]保存每个状态值
   对于每组与子问题有关系的变量,我们对他们进行取值,称之为子问题的“状态”,而“状态”的值就是该子问题的解。
   定义出什么是“状态”、得到“状态”的值后,就要找出不同状态之间的迁移关系,即通过一个状态求另一个状态的值,往往有一个递推公式,我们把这个递推公式成为状态转移方程。
 
   现在反过来看这道题:
输入数据 
输入的第一行是序列的长度N (1 <= N <= 1000)。第二行给出序列中的 N 个整数,这些
整数的取值范围都在0 到10000。 
输出要求 
最长上升子序列的长度。 
输入样例 

1 7 3 5 9 4 8 
输出样例 
4
 
   问题分析:
        怎么分解成子问题呢?我们把“以a k为终点的序列的最长上升子序列的长度”作为问题的子问题,其中k = 1,2,3......N .
        这样就把问题分解为N个子问题,只要我们把这N个子问题解决了,从中找出解值最大的即为原问题的解
        怎么求状态转移方程呢?显然当k = 1的时候,maxlen[k] = 1;而通过k=1这个状态求别的状态的转移方程则可以写成:
         maxlen[k] = (max(maxlen[i]),i = 1,2,3,....,k-1&& str[i] < str[k]) + 1;
        这个方程的含义是:要求以a k为终点的序列的最长上升子序列的长度,只要算出以满足条件的a k左边的某一个数为终点的序列的最长上升子序列的长度 再 加上a k这个数,即长度再加1即可,得到的这样一个序列必定是包含a k
        这里要充分理解递归的思想(虽然这里并不用到递归函数)
复制代码
复制代码
 1 #include <iostream>
 2 using namespace std;
 3 
 4 int str[1001];
 5 int maxlen[1001];
 6 int p[1001];
 7 
 8 int main()
 9 {
10     int N;cin >> N;
11     memset(str,0,sizeof(str));
12     for(int i = 1;i < N;i++)
13         cin >> str[i];
14     memset(maxlen,0,sizeof(maxlen));
15     maxlen[1] = 1;
16     for(int i = 2;i < N ;i++){
17         int temp = 0;
18         for(int j = 1;j < i;j++){
19             if(str[j] < str[i])
20                 if(temp < maxlen[j])
21                     temp = maxlen[j];
22         }
23         maxlen[i] = temp + 1;
24     }
25     int temp = -1;
26     for(int i = 1;i < N ;i++){
27         if(temp < maxlen[i])
28             temp = maxlen[i];
29     }
30     cout << temp;
31 }
复制代码
复制代码
本文转自编程小翁博客园博客,原文链接:http://www.cnblogs.com/wengzilin/archive/2012/10/15/2724874.html,如需转载请自行联系原作者
相关文章
|
5月前
|
机器学习/深度学习 算法 测试技术
【动态规划】【最长子序列】2901. 最长相邻不相等子序列 II
【动态规划】【最长子序列】2901. 最长相邻不相等子序列 II
【动态规划刷题 15】最长定差子序列&& 最长的斐波那契子序列的长度
【动态规划刷题 15】最长定差子序列&& 最长的斐波那契子序列的长度
【动态规划刷题 14】最长递增子序列的个数&& 最长数对链
【动态规划刷题 14】最长递增子序列的个数&& 最长数对链
|
5月前
代码随想录 Day44 动规12 LeetCode T300 最长递增子序列 T674 最长连续递增序列 T718 最长重复子数组
代码随想录 Day44 动规12 LeetCode T300 最长递增子序列 T674 最长连续递增序列 T718 最长重复子数组
58 0
|
5月前
|
人工智能
leetcode-718:最长重复子数组
leetcode-718:最长重复子数组
46 0
|
5月前
|
算法 程序员 索引
【算法训练-动态规划 三】【双序列DP问题】最长重复子数组、最长公共子串、最长公共子序列、编辑距离
【算法训练-动态规划 三】【双序列DP问题】最长重复子数组、最长公共子串、最长公共子序列、编辑距离
91 0
|
12月前
|
算法
【学会动态规划】最长递增子序列的个数(28)
【学会动态规划】最长递增子序列的个数(28)
39 0
|
机器学习/深度学习 人工智能 算法
代码随想录训练营day52| 300.最长递增子序列 674. 最长连续递增序列 718. 最长重复子数组...
代码随想录训练营day52| 300.最长递增子序列 674. 最长连续递增序列 718. 最长重复子数组...
初学算法之动态规划---最长上升子序列
初学算法之动态规划---最长上升子序列
|
人工智能
leetcode 718 最长重复子数组
leetcode 718 最长重复子数组
62 0
leetcode 718 最长重复子数组