【動態規劃】連續子數組的最大和,手撕了它。

最近接觸到了一些動態規劃的題目,也翻閱了好多資料,研究了一下動態規劃的思想,現在來個總結。

 

https://www.nowcoder.com/practice/459bd355da1549fa8a49e350bf3df484?tpId=13&tqId=11183&tPage=2&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

例如:{1,-5,6,7,-3,5,2},連續子向量的最大和爲17(從第2個開始,到第6個爲止)。給一個數組,返回它的最大連續子序列的和。

動態規劃是一種思想,在變化的事物中找出不變的規律。關於動態規劃的數學證明和高深一點的數學理論這裏不談了,這裏講一下筆者弄懂了的填表法實現動態規劃。

我們需要一張表,去按照題目的要求豐滿這張表,說白了就是在這個表當中列舉出所有可能的情況,然後在數據當中找出不變的規律,然後用代碼描述出來,就能夠解決題目所求。

我們分析這個問題,要求最大連續子序列的和,有幾個關鍵的點連續、最大,這是對我們解題實現手段的限制,同時也是我們應該利用到的特性,前面說過,填表法就是找出所有可能的情況,現在我們看錶

方法一、

 

通過表格我們可以發現,17就是我們要找的答案,在填表的過程沒有直接發現數字之間的規律。比如,下一個答案和上面的數字有一定的數學關係。填完表之後從17在表中的位置發現瞭如上規律,接下來我們要做的就是用代碼來實現這個規律。

也可以通過數學推導發現規律:

方法二、

方法三、

 

 

發現:規律是下一次的結果僅僅取決於上一次的狀態和本次的狀態,表中所填的數據每一行保證了往前的子段都是連續的,我們能夠得到當前的連續子段最大和是:上次最大子段和加上本次新的元素和與本次單個元素兩個的最大值。整體的和就是每次尋找得到的所有最大值裏面的最大值。(動態規劃一般是上一次狀態和本次狀態的關係,從而可以遍歷到所有的情況)

int FindMax(int num[], int size)
 {
 
	if (size <= 0)
	{
		return 0;
	}
	int max = num[0];
	int tmp = num[0];
	for (int i = 1; i < size; i++)
	{
		tmp = tmp + num[i];
		if (num[i] > tmp)
			tmp = num[i];
		if (tmp > max)
			max = tmp;
	}
	return max;
}

 EOF

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章