華爲OJ--Redraiment的走法--尋找最大遞增子序列

題目:

題目 Redraiment的走法
題目描述 Redraiment是走梅花樁的高手。Redraiment總是起點不限,從前到後,往高的樁子走,但走的步數最多,不知道爲什麼?你能替Redraiment研究他最多走的步數嗎?
樣例輸入 6
2 5 1 5 4 5
樣例輸出 3
提示 Example:
6個點的高度各爲 2 5 1 5 4 5
如從第1格開始走,最多爲3步, 2 4 5
從第2格開始走,最多隻有1步,5
而從第3格開始走最多有3步,1 4 5
從第5格開始走最多有2步,4 5
所以這個結果是3。
接口說明 方法原型:
int GetResult(int num, int[] pInput, List pResult);
輸入參數 int num:整數,表示數組元素的個數(保證有效)。
int[] pInput: 數組,存放輸入的數字。
輸出參數 List pResult: 保證傳入一個空的List,要求把結果放入第一個位置。
返回值 正確返回1,錯誤返回0

思想:本題就是一個求解最大的遞增子序列即可!
例如:我們現在給定一個長度爲5的數組list:[4, 5, 1, 3, 6],那麼最大的遞增數組則是:[1, 3, 6]或者[4, 5, 6],長度是3.
則我們該題目我們可以利用動態規劃的思想來寫,設置一個dp[i]是記錄上面數組list[i]爲末尾元素的最長遞增子序列。
算法的過程:
i = 0;則dp[i] = 1,因爲此時A[i] = 4,此時只有一個元素構成了子序列
i = 1;則dp[i] = 2,因爲此時A[i] = 5,dp[i] = d[0] + 1;
i = 2;則dp[i] = 1,因爲此時A[i] = 1,前面並沒有一個元素大於A[i],則dp[i] = 1;
i = 3;則dp[i] = 2,因爲此時A[i] = 3,那麼前面只有A[2]小於A[i],也就是dp[i] = dp[2] + 1 = 2;
i = 4;則dp[i] = 3,因爲此時A[I] = 4,那麼前面有A[0],A[1],A[2],A[3]小於A[i],此時,這些元素的dp[i]最大的是2,那麼就是dp[i] = max(前面最大的dp數組元素) +1;

也就是說,求最大的遞增子序列,我們可以,先從數組元素第一位開始遍歷,從第一位開始求解以當前元素作爲末尾元素的時候數組的最大的遞增子序列的元素個數,後面元素i的最大遞增子序列元素個數就是前面比list[i]小的元素的最大遞增子序列元素個數 + 1。

則該數組的最大子序列元素個數求解算法

int find()
{
	int list[5] = {4,5,1,3,6};
	int dp[5] = {1};
	for(int i = 0; i < 5; i++)
	{
		dp[i] = 1;
		for(nt j = 0; j < i; j++)
		{
			if(list[j] < list[i] && dp[j] >= dp[i])
				dp[i] = dp[j] + 1;
		}
	}
	int max = -1;
	for(nt i = 0; i < 5; i++)
		if(max< dp[i])
			max = dp[i];
	return Max;
}

現在對該算法題目進行算法實現,其實原理也是一樣的。

#include <iostream>
#include <algorithm>
using namespace std;
#define maxSize 200//定義最大的數組
int list[maxSize];
int d[maxSize];
int num;//數組的個數
int main()
{
	while(cin >> num)//循環輸入
	{
		int max = 0;//定義max最大遞增子序列長度爲0
		for(int i = 1; i <= num; i++)
		{
			cin >> list[i];//循環輸入
		}
		
		for(int i = 1; i <= num; i++)
		{
			max = 0;//設置max的爲0,這裏max代表循環找到前面最大的遞增子序列最大的長度
			for(int j = 1; j < i; j++)//遍歷比i小的元素
			{
				if(list[j] < list[i])//如果說,這個元素比list[i]小,就可以再增長
				{
					if(max < d[j])//且此時,我記錄下的最大遞增子序列長度小於現在這個元素的
					{
						max = d[j];//替換
					}
				}
			}
			d[i] = max + 1;//最後加上向這個i的元素向上走一步
		}
		//循環找到這個d數組裏面最大的長度即可
		for(int i = 1; i <= num; i++)
		{
			if (max < d[i]){
				max = d[i];
			}
				
		}
		cout << max << endl;
	}
	
	
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章