【动态规划】最长递增子序列

时间复杂度O(n*n)

 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 }
View Code

 

posted @ 2016-09-05 14:26  lp3318  阅读(128)  评论(0编辑  收藏  举报