问题描述:
给定一串序列:如(3,1,4,8,12,64,7)
从中找到最长的上升子序列: 如这个例子中为3,4,8,12,64
思路:利用动态规划
确定状态:当以N元素为终点时,N元素前的最长上升子序长度
子问题汇总:所有状态下的长度的最大值
边界条件:当以第一个元素为终点时 长度为1
状态转移:
MAXSUM[i] = max(MAXSUM[i], MAXSUM[j] + 1);
第N元素前的最长子序列长度加上N的自身长度(1)
和MAXSUM[i] 前一个最长的长度比较 如果更长 则进行替换
#include<iostream>
#include<stdlib.h>
#include<ctime>
#include<algorithm>
#define MaxSize 101
using namespace std;
int MAXSUM[MaxSize]; //一致的镜像
int D[MaxSize]; //用来存储数组
void main() {
srand(time(NULL));
int N; //表示数组容量
//元素赋值
cin >> N;
for (int k = 1; k <= N; ++k) {
D[k] = rand() % 100;
MAXSUM[k] = 1;
}
cout << endl << endl;
for (int i = 2; i <= N; ++i) //从第二个元素开始 往下递推
for (int j = 1; j < i; ++j) {
if (D[i] > D[j]) {
//将每个更长的结果进行替换
MAXSUM[i] = max(MAXSUM[i], MAXSUM[j] + 1);
}
}
cout << *max_element(MAXSUM + 1, MAXSUM + N + 1) << endl;
system("PAUSE");
return;
}