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


    时间复杂度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
  • 相关阅读:
    intersect参数
    创建图层只是保存lyr,此路不通
    点在线上
    GPS点和底图叠加
    Ifeature.set_value(index,value)怎么没结果,请高手指点
    GP的输入参数
    关于调用ArcGIS中GP工具.Erase、SymDiff
    ArcEngine 导出图层(shp)
    转载 高效实用的异或操作
    判断一个整数是否是奇数的小解
  • 原文地址:https://www.cnblogs.com/lp3318/p/5842155.html
Copyright © 2020-2023  润新知