【动态规划】最长递增子序列
时间复杂度O(n*n)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 // zuichangdizengzixulie.cpp : 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 #include <iostream> 6 #include <vector> 7 #include <iterator> 8 using namespace std; 9 10 void generateLis(int* arr,int len,vector<int>& dp) 11 {//1.生成决策表。dp[i]表示以arr[i]结尾的最长子序列长度 12 for(int i = 0 ; i < len ; i++) 13 { 14 dp[i] = 1; 15 for(int j = 0; j < i;j++) 16 { 17 if(arr[j] < arr[i]) 18 dp[i] = max(dp[i],dp[j] + 1); 19 } 20 } 21 22 //2.根据dp反向得到子序列 23 //2.1 得到dp中的最大值及索引 24 int maxInDp = 0; 25 int index = 0; 26 for(int i = 0; i < len;i++) 27 if(dp[i] > maxInDp) 28 { 29 maxInDp = dp[i];//就是最长递增子序列的长度 30 index = i; 31 } 32 //2.2 根据dp反向收集 33 vector<int> result; 34 result.resize(maxInDp); 35 result[--maxInDp] = arr[index]; 36 for(int i= index;i >= 0;i--) 37 { 38 if(arr[i] < arr[index] && dp[i] == dp[index] - 1) 39 { 40 result[--maxInDp] = arr[i]; 41 index = i; 42 } 43 } 44 45 //2.3 打印result 46 vector<int>::iterator ite = result.begin(); 47 for(;ite != result.end();ite++) 48 cout<<*ite<<" "; 49 cout<<endl; 50 } 51 52 int _tmain(int argc, _TCHAR* argv[]) 53 { 54 int arr[] = {2,1,5,3,6,4,8,9,7}; 55 int len = 9; 56 for(int i = 0 ; i < 9; i++) 57 cout<<arr[i]<<" "; 58 cout<<endl; 59 60 /*生成dp数组*/ 61 vector<int> dp; 62 dp.resize(len); 63 for(int i = 0; i < len;i++) 64 dp[i] = 0; 65 66 generateLis(arr,len,dp); 67 system("pause"); 68 return 0; 69 }