问题描述:
给定一串序列:如(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;
} 










