題意:
給你乙個序列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.
可以這麼理解這個轉移方程,對於當前的這個數字,如果把他放到第i個子序列中有兩種情況,乙個是他作為第i個子序列的第乙個數字,另乙個就是不作為第乙個數字,作為第乙個數字的時候是 maxx(dp[i-2][k] + num[j]) 1<=k
__int64 max
for(i = 1 ;i <= m ;i ++) //枚舉子序列
}最後直接輸出max就行了,因為裡面儲存的正好是第m個子序列中最大的那個。
#include#include#define n 110000#define inf 922337203685477580
__int64num[n] ,dp[n] ,mk[n];
__int64maxx(
__int64x,
__int64y)
intmain
() }printf("%i64d\n",max);
}return0;
}
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...
HDU 1024 新最大子串行和 DP
題意是要在一段數列中求 m 段互不重合的子數列的最大和。動態規劃,用陣列 num 儲存所給數列,建二維陣列 dp dp i j 表示當選擇了第 j 個數字 num j 時,前 j 個數字被分成 i 組的所得最大和。那麼這個最大和等於 max 即 dp i j max dp i j 1 dp i 1 ...
HDU1024 最大子段和
題意 給n個數 然後把這些數分成m段 求子段和的最大值 思路 不難去想 我們用dp i j 去表示前面j個數分成了i段的最大值 那麼就會出現乙個問題 那就是第j個數是不是在這i段之內 1 我們把第j個數放在前i段內 那麼顯然 dp i j dp i j 1 a j 2 我們讓第j個數去乙個新段 那個...