您的位置:首页 > 其它

LeetCode300 最长上升子序列

2018-03-22 18:34 309 查看
/*!
* @file     最长上升子序列.cpp
* @Date:    2018/03/22 17:22
* @author:  sicaolong
* @Contact: sicaolong@163.com
* @brief:
思路:
1、memo的状态变换;number[i]与number[j]的大小关系;
number[i]>number[j]
memo[i]=max(1+memo[j],memo[i]);求出m每个位置的LIS
2、循环遍历找出memo中的最大值;
* @TODO:
*/
#include<iostream>
#include <vector>

using namespace std;
int get_length_of_LIS_DP(vector<int>&numbers);
int max(int a, int b)
{
return  a > b ? a : b;
}
//=========main函数
int main()
{
vector<int >numbers = { 10, 9, 2, 5, 3, 7, 101, 18 };
int length=get_length_of_LIS_DP(numbers);
cout<<length<<endl;
}
int get_length_of_LIS_DP(vector<int>&numbers)//时间复杂度为o(n*n);
{
if (numbers.size() == 0)
return 0;

vector<int>best(numbers.size(), 1);
//memo[i]表示以number[i]为结尾的LIB的长度;
for (int i = 0; i < numbers.size();++i)
for (int j = 0; j < i;j++)
if (numbers[j] < numbers[i])//考察numbers[j]是不是在numbers[i]的后面
best[i] = max(best[i], 1 + best[j]);//更新memo[i]的值;求出每个位置的LIS
int result = 1;
for (int i = 0; i < numbers.size(); i++)//循环遍历,找出最大的结果;并返回到result中
result = max(result, best[i]);
return result;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  LeetCode LIS