HDU 3480 DP 斜率優化

2022-09-23 13:48:12 字數 2058 閱讀 8605

題意:給你n個數字,然後叫你從這些數字中選出m堆,使得每一堆的總和最小,一堆的總和就是這一堆中最大值減去最小值的平方,最後要使得所有堆加起來的總和最小。

思路:對這些數字排序之後,很容易想到dp解法,用dp[i][j]表示數字i現在在第j堆,那麼轉移方程就是dp[i][j] = min(dp[i][j] , dp[k][j - 1] + (a[i] - a[k + 1]) ^ 2)。因為已經排序,所以這一堆中的最大最小值其實就是a[i]和a[k + 1]。所以用dp可解。

但是注意到這實際上是需要3重迴圈的,而且n和m分別為10 ^ 4和5 * 10 ^ 3,所以會tle。

其實看到轉移方程後面的部分,我們就應該能想到斜率優化的方法。

假設k < l < i,我們要使得k的決策優於l,那麼也就是dp[k][j - 1] + (a[i] - a[k + 1]) ^ 2 < dp[l][j - 1] + (a[i] - a[l + 1]) ^ 2 。

化簡得(dp[k][j - 1] + a[k + 1] ^ 2 - (dp[l][j - 1] + a[l + 1] ^ 2)) / (2 * (a[k + 1 ] - a[l + 1])) < a[i] 。

也就是說符合上述斜率要求的k,是優於l的。

我們用g(k ,l )表示k的決策優於l。

那麼我們每次更新 dp[i][j]的值的時候,只需要取出最優的決策即可,所以這一維就是o(1) .

進一步說,在第乙個while 中,如果這時候佇列裡有兩個元素,qe[l + 1] 和qe[l]。如果這時候g(qe[l + 1] , qe[l])成立,那麼這時候qe[l]就不需要再計算了,因為qe[l + 1]的決策比他更優,所以我們只需要找出最優的決策,更新一次即可。

同樣的,假設k < l < i 。如果g(i , l ) < g(l , k),那麼此時l是可以被優化掉的。因為他不可能是最優解。這就是第二個while的作用。 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define max 2505

#define fi first

#define se second

#define ll long long

#define pi acos(-1.0)

#define inf 0x3fffffff

#define ll(x) ( x << 1 )

#define bug puts("here")

#define pii pair

#define rr(x) ( x << 1 | 1 )

#define mp(a,b) make_pair(a,b)

#define mem(a,b) memset(a,b,sizeof(a))

#define rep(i,s,t) for( int i = ( s ) ; i <= ( t ) ; ++ i )

using namespace std;

#define n 11111

#define m 5555

int dp[n][m] ;

int a[n] ;

int getu(int j ,int k ,int z)

int getd(int k , int z)

int getdp(int i , int j ,int k)

int qe[n * 10] ;

void solve()

dp[0][0] = 0 ;

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

} cout << dp[n][m] << endl;

} int main()

return 0 ;

}   

HDU 3480 Division 斜率優化DP

題意 現在有n個元素的集合s。把集合s劃分成m個子集,每個子集的花費為集合中最大和最小元素的差的平方。求如何劃分,才能總的代價最小。思路 首先要注意到,因為集合中的元素具有無序性,我們只需知道集合中最大和最小的元素就能算出代價,也能把集合劃分出來。所以,我們把所有元素進行排序,這樣,最小的元素和最大...

hdu 4258 斜率優化DP

題目大意 將n個公升序數字序列,分成幾組連續的序列 每一組的所得值,等於最右邊的num2減去最左邊 的num1,的平方 c即 numi numj 2 c 解題報告 人 ghq springwater 分析可得 dp j2 dp j1 num j2 1 num j2 1 num j1 1 num j1...

hdu3507斜率優化dp

這題 n可能取500000,o n 2 就會超時吧,所有只能優化。注意到這題的動態規劃方程 dp i max dp j sum i sum j 2 m 化簡下得 dp i max dp j sum i 2 sum j 2 2 sum i sum j 無法直接用單調佇列優化,i和j不能分開。假設j比k...