HDU 1024 新最大子串行和 DP

2022-05-09 18:48:39 字數 805 閱讀 3645

題意是要在一段數列中求 m 段互不重合的子數列的最大和。

動態規劃,用陣列 num[ ] 儲存所給數列,建二維陣列 dp[ ][ ] , dp[ i ][ j ] 表示當選擇了第 j 個數字( num [ j ] )時,前 j 個數字被分成 i 組的所得最大和。

那麼這個最大和等於 max;

即 dp[ i ][ j ] = max( dp[ i ][ j - 1], dp[ i - 1 ][ k ] ) + num[ j ];

但是這麼大的二維陣列開不了的,而且每次算當前狀態時只需要前一狀態,再之前的沒什麼用,(即狀態具有後無效性,前面的選擇不會影響後續選擇)因此使用滾動陣列,再乾脆直接開兩個一維陣列,dp[ ] 和 pre[ ],pre[ j - 1 ] 表示 j - 1 之前的數的最大和

( 不包括 num[ j - 1 ] ) ,dp[ j ] 表示選擇了 num[ j ] 時前 j 個數字的最大和,

則 dp[ j ] = max( dp[ j - 1 ] ,pre[ j - 1 ] ) + num [ j ];

1 #include2

using

namespace

std;

3const

int maxn = 1000000;4

intdp[maxn],pre[maxn],num[maxn];

5int

main()623

}24 printf("

%d\n

",tmp);25}

26return0;

27 }

view code

HDU1024 最大子段和

題意 給n個數 然後把這些數分成m段 求子段和的最大值 思路 不難去想 我們用dp i j 去表示前面j個數分成了i段的最大值 那麼就會出現乙個問題 那就是第j個數是不是在這i段之內 1 我們把第j個數放在前i段內 那麼顯然 dp i j dp i j 1 a j 2 我們讓第j個數去乙個新段 那個...

hdu1024 最大m子串行和

題意 給你乙個序列n個數組成,然後讓你在裡面找到m個子序列,讓這m個子序列的和最大。思路 dp i j 表示的是第j個數字在第i個子序列時的當前最優值。dp i j maxx dp i j 1 num j maxx dp i 1 k num j k是從1到j 1.可以這麼理解這個轉移方程,對於當前的...

HDU 1024最大m段字段和

題意 給你n個數,選m個子段,各個子段連續且不相交,長度可以為1,設maxn為各個子區間的和,求最大的maxn。分析 設dp i j 代表 j個數選取 i 個子段 maxn最大的值 得狀態轉移方程dp i j ma x dp i j 1 dp i j 1 a j dp i 1 k a j 0 kdp...