動態規劃 HDU 1003最大子串行和

2021-10-03 08:15:24 字數 862 閱讀 1896

解題思路:

主要思想是動態規劃的思想,maxsum中儲存了當前位置 j 之前的最大子串行和。

我們考慮到:當某一子串行的和為負數時,在讀取新的數n[j]時,它總會有一定的抵消作用使新的和比n[j]小,即它不可能對最大子串行和做出更多的貢獻。故此時我們可以丟棄這一段子串行,轉而從它後面著手。(當然了,如果這一子串行僅包含第乙個數字,我們要將它記錄在maxsum中)。

藉此我們容易得到狀態轉移方程:

dp[j] = max(dp[j-1]+n[j] , n[j]) (此處dp[j]表示位置 j 之前的最大子串行和)

我的**沒有用到dp陣列,是因為我們是從前到後進行讀取的,可以僅用到陣列n來完成演算法。解釋:

因為本題是從前到後進行數字的讀取,與題目所要求得到的答案的順序(子串行,從前往後連續)相同。故而dp陣列(dp[j]表示位置j之前的最大子串行之和)的作用完全可以由maxsum替代。

ac**:
#include

using

namespace std;

int n[

100000];

int amount;

intmain

(int argc,

char

** ar**)

if(cursum<0)

}printf

("%d %d %d\n"

,maxsum,st,ed);if

(i!=time-1)

putchar

('\n');

}return0;

}

※解題思路受discuss中的**啟發。

hdu1003最大子串行和

看了一些別人的題解,說實話,我現在還不會證明這個,我不知道為什麼這樣是最大值 hdu1003最大連續子串行和 sum i sum i 1 0 sum i 1 a i a i 只有當sum處於增長狀態時才會得到最大子串行 當sum處於減小狀態時,應當更新起點 include using namespa...

HDU1003 最大子串行和

大學搞過兩年的acm,今天心血來潮的去杭電oj上瀏覽了一下,真幸運賬號居然沒有記錯。然後想著之前學過很多經典的演算法,但是很遺憾當時沒有記錄下來,所以現在彌補遺憾的時候到了,演算法會不定期更新。include int array 100005 n void maxsubsum1 void maxsu...

HDU 1003最大子段和

題目 輸入n,r然後輸入n個數字,求這些數字中的最大子段和,並標明起點終點。input 2 5 6 1 5 4 7 7 0 6 1 1 6 7 5 sample output case 1 14 1 4 case 2 7 1 6 思路 簡單的dp題。用dp i 表示以數字i為終點的最大子段和。初始化...