1. 程式人生 > >HDU 1024 簡單dp 滾動陣列

HDU 1024 簡單dp 滾動陣列

 

要求:n個正陣列成的序列,整數範圍-32768 ≤ S ≤ 32767,1 ≤ n ≤ 1,000,000,挑出m個無交集的連續子序列使這些序列和最大,並輸出最大值。

方法:二維dp、滾動陣列降維。

1.dp[i][j]表示第一個數到下標為j的數挑出i個連續子序列組成的最大值。

2.dp[i][j]=max(dp[i][j-1],dp[i-1][k])+num[j]這是最初的dp公式,k用從i-1到j-1的每一個數字遍歷。

意義:若dp[i][j-1]>dp[i-1][k],則在下標為j-1的數後面新增下標為j的數,使第i個序列長度加1,

           若dp[i][j-1]<dp[i-1][k],則在最大的下標為k的數後面,新增第i個序列,且第i個序列首元素下標為j。

高維dp我第一次看不懂怎麼用,想了想因為有dp[i-1][k]的存在起到了又加一維的作用,多了一維。

3.但是因為n的範圍會爆掉dp陣列,又觀察到dp方程之和前一個狀態有關,因此想到了滾動陣列降維。

dp[j]表示第一個數到下標為j的數挑出i個連續子序列組成的最大值,i暗含於最外層的for迴圈內!!!!!!

pre[j]表示第一個數到下標為j-1的數挑出i-1個連續子序列組成的最大值,i-1暗含於最外層的for迴圈內!!!!!!

 

總感覺滾動陣列減小空間複雜度,沒有降低時間複雜度。減少了一層迴圈k是因為pre用了不斷更新最大值,和上一層沒啥關係。