hdu1003 dp,最大子串行和

2021-09-24 23:41:54 字數 1026 閱讀 9061

這道題應該是第一次做的dp題,雖然以前可能亂做題做到過要用到dp的題,但這道題是開始!

網上找了篇部落格,看了下dp的思想,不得不說真的是自己見識短淺,太巧妙了。

摘自他人部落格:

題目大意:給定序列個數n及n個數,求該序列的最大連續子串行的和,要求輸出最大連續子串行的和以及子串行的首位位置

解題思路:經典dp,可以定義dp[i]表示以a[i]為結尾的子串行的和的最大值,因而最大連續子串行及為dp陣列中的最大值。

狀態轉移方程:dp[1] = a[1]; //以a[1]為結尾的子串行只有a[1];

i >= 2時, dp[i] = max( dp[i-1]+a[i], a[i] );

dp[i-1]+a[i] > a[i]時,即dp[i-1]的值為正,那麼dp[i-1]則對dp[i]有貢獻,

dp[i-1]+a[i] < a[i]時,即dp[i-1] < 0,那麼拋棄它,dp[i] = a[i]

例子:序列 6 -7 5 2 -3, 則dp[i]分別為 6 -1 5 7 4,注意dp[2]直接用a[2]表示,因為dp[1] = -1 < 0; 最後最大子串行和即為dp陣列中的最大值 5;

至於位置的記錄,則再每次獲取到最大值時更新即可。另外此題是從前往後更新,可直接使用a[i]陣列而省下乙個dp陣列。

**:

#include

#include

#include

struct

dp[100050];

intmain()

else

else}if

(dp[j]

.sum>max)

}printf

("case %d:\n"

,i+1);

printf

("%d %d %d\n"

,max,start1,end1);if

(i!=t-1)

printf

("\n");

}return0;

}

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 最大子串行的和

sample input2 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 題目要我們輸出的三個數分別表示 最大和的子串行,就是乙個序列取它連續的一段數,要求和最大 最大和的子串行的開始位置 最大和的子串行的最...