HDU1024 最大子段和

2022-07-24 03:57:14 字數 783 閱讀 3250

題意:給n個數 然後把這些數分成m段 求子段和的最大值

思路:不難去想 我們用dp[i][j]去表示前面j個數分成了i段的最大值 那麼就會出現乙個問題 那就是第j個數是不是在這i段之內 (1) 我們把第j個數放在前i段內 那麼顯然 dp[i][j]=dp[i][j-1]+a[j] (2) 我們讓第j個數去乙個新段 那個前j-1個數就只能分成i-1段 因為我們讓第j個數成了第i段 那這個時候 dp[i][j]=dp[i-1][j-1]+a[j]? 顯然不是的

這個時候我們需要去列舉第i-1個元素到底j-1個元素中分成i-1段的值 然後去找最大值

看了網上乙個大佬用的矩陣圖 我們可以清楚的看到dp[3][6]的值就是他左邊的那個數和畫圈的那個數中的最大值加上a[6] 這個時候我們就可以發現dp[i][j]其實等於dp[i][j-1]和上一行中數的最大值再去加上a[j] 所以 狀態方程可以得到dp[i][j]=max(dp[i][j-1]+a[j],max(dp[i-1][k]+a[k])) (i-1<=kusing namespace std;

const int maxn=1e6+6;

const int inf=0x3f3f3f3f;

int a[maxn],dp1[maxn],dp2[maxn];

int main()

for(int i=1;i<=m;i++)

}cout<

} return 0;

}

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 最大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.可以這麼理解這個轉移方程,對於當前的...