題意是要在一段數列中求 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 #include2view codeusing
namespace
std;
3const
int maxn = 1000000;4
intdp[maxn],pre[maxn],num[maxn];
5int
main()623
}24 printf("
%d\n
",tmp);25}
26return0;
27 }
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...