动态规划——最长升序子序列

来源:互联网 发布:python 2.7不支持中文 编辑:程序博客网 时间:2024/06/05 03:22

问题描述

一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1, a2, ..., aN),我们可以得到一些上升的子序列(ai1, ai2, ..., aiK),这里1 <= i1 < i2 < ... < iK <= N。比如,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序列,如(1, 7), (3, 4, 8)等等。这些子序列中最长的长度是4,比如子序列(1, 3, 5, 8).

你的任务,就是对于给定的序列,求出最长上升子序列的长度。


“test.cpp”

#include<iostream>using namespace std;#include<vector>void test(){int arr[] = {0,1,2,6,3,5,6,7,8,9,0};//int arr[] = {2,3,4,2,3,4,5,0,3};int end = 0;int mark_end = 0;int size = 1;int mark_size = -1;//[开始位置,长度][长度,结束位置][开始位置,结束位置]三者等价for(int i = 1;i < sizeof(arr)/sizeof(arr[0]);++i){if(arr[i] >= arr[end])++size;else{if(size > mark_size){mark_end = end;mark_size = size;}//结束后长度重新置1,从新位置开始记录size = 1;}++end;}//如果arr[i] > arr[end],size++后,并没有和mark_size的值比较if(size > mark_size){mark_end = end;mark_size = size;}int index = 0;vector<int> tmp(mark_size);for(int i = mark_end - mark_size + 1;i <= mark_end;++i){tmp[index++] = arr[i];}//打印for(int i = 0;i < tmp.size();++i){cout<<tmp[i]<<" ";}cout<<endl;}int main(){test();return 0;}

动态规划:求最长升序子序列的长度

“test.cpp”

#include <iostream>using namespace std;#include <vector>void test(){int arr[] = {2,3,4,2,3,4,5,0,3};int size = sizeof(arr)/sizeof(arr[0]);int maxlen = -1;vector<int> len(size,1);//存放以i为终点的最长升序序列的个数for (int i = 1;i < size;++i){int max = 0;for (int j = 0;j < i;++j){//寻找以i为终点,前i-1个序列中的最长子序列,即为最优的子状态if (arr[j] < arr[i] && len[j] > max){max = len[j];}}len[i] = max + 1;if (maxlen < len[i]){maxlen = len[i];}}//打印状态列表for (int i = 0;i < size;++i){cout<<len[i]<<" ";}cout<<endl;cout<<"最长升序序列长度:"<<maxlen<<endl;}int main(){test();system("pause");return 0;}




0 0
原创粉丝点击