要求: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我第一次看不懂怎麼用,想了想因為有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用了不斷更新最大值,和上一層沒啥關係。
HDU 1024 簡單dp 滾動陣列 字首和
要求 n個數分為m個不相交的區間,求m個區間內所有數的和。方法 動態規劃裸題 滾動陣列 1.根據題意,dp i j 表示前j個數分為i組且用了第j個數的最大值。第j個數要麼是加入第i個組 隱藏含義是加入第j 1個數的組 或者自成第i組,故dp i j max i 1 k j 1 2.要求dp i j...
hdu 1024 滾動陣列優化
本題的大致意思為給定乙個陣列,求其分成 m個不相交子段和最大值的問題。解題思路 dp i j 表示前j個數分成i組,且j在第i組裡的最大值。dp i j max,前乙個表示j與j 1在i組裡,後乙個表示j單獨成組。但這道題的n很大,空間複雜度太高,所以要用滾動陣列。max dp i 1 k 就是上一...
hdu 1024(滾動陣列的學習)
學習了一下滾動陣列,dp中經常卡記憶體,而利用滾動陣列可以大大節省記憶體空間,不錯哦。1 include2 include3 include4 const int n 1000010 5 const int inf 1000000000 6 using namespace std 78 inta n...