0
点赞
收藏
分享

微信扫一扫

动态规划-再次理解最长上升子序列

一点读书 2023-05-18 阅读 67


问题描述:

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





举报

相关推荐

0 条评论