動態規劃求解最長上升子序列問題

ZHUO_SIR發表於2018-10-28
// ch12.cpp: 定義控制檯應用程式的入口點。
//

#include "stdafx.h"
#include "iostream"
#include "vector"
using namespace std;
int main()
{
	//輸入資料
	int N;
	cin >> N;
	vector<int>nums;
	for (int i = 0; i<N; i++)
	{
		int numIn;
		cin >> numIn;
		nums.push_back(numIn);
	}

	int result[1001] = { 1 };//result[i]表示序列0-i上的最長序列長度

	int maxLen = 1;//維護輸出結果maxLen
	for (int i = 1; i<N; i++)
	{
		if (result[i] == 0)   //初始化result陣列
			result[i] = 1;
		//更新
		for (int j = 0; j<i; j++)  //從前向後掃描以[i-1]為尾部的陣列,動態更新result[j](j從0到i-1)值
		{
			if (nums[i]>nums[j]) {
				if ((result[j] + 1)>result[i])
					result[i] = result[j] + 1;
				if (result[j] + 1>maxLen)
					maxLen = result[j + 1];
			}
		}
		//        for(int j=0;j<N;j++)
		//            cout<<result[j];
		//        cout<<endl;
	}
	cout << "最長上升子序列的長度為:" << maxLen << endl;
	return 0;
}

執行結果如下圖:

相關文章