!HDU 4121 搬寢室 dp (分組問題)

2021-07-03 18:58:38 字數 1110 閱讀 2611

題意:共有n件物品,需要搬走2*k件,每次左右手各搬一件,疲勞度是(a-b)^2,求搬完k件最小的疲勞度和

分析:也就是把n分成兩兩一組,共分k組。分組dp模型。

一般都是:dp[i][j]表示前i件分成j組的最優解;然後考慮第i件物品是否被選入:1).選:dp[i][j]=dp[i-2][j-1] ;2).不選:dp[i][j]=dp[i-1][j]。

綜合:dp[i][j]=min(dp[i-2][j-1]+(a[i]-a[i-1])^2,dp[i-1][j])

有兩種實現方法:

1.dp[i][j]表示前i件分j組:

memset(dp,inf,sizeof(dp);

for(int i=2;i<=n;i++)

for(int j=1;j*2<=i;j++)

dp[i][j]=min(dp[i-2][j-1]+(a[i]-a[i-1])^2,dp[i-1][j]);

2.dp[i][j]表示前j件分i組:

memset(dp,0,sizeof(dp));

for(int i=1;i<=k;i++){

dp[i][i*2]=dp[i-1][i*2-2]+(a[i*2]-a[i*2-1])^2;

for(int j=i*2+1;j<=n;j++)

dp[i][j]=min(dp[i-1][j-2]+(a[j]-a[j-1])^2,dp[i][j-1]);

1的**:

#include#include#include#include#define inf 2147483646

using namespace std;

int n,k;

int dp[2010][1010];

int a[2010];

int min(int i,int j)

{ return i

#include#include#include#include#define inf 2147483646

using namespace std;

int n,k;

int dp[1010][2010];

int a[2010];

int min(int i,int j)

{ return i

hdu 1421 搬寢室 dp問題

以前雖然寫過dp問題,但思想上過不去,覺得dp跟遞迴似乎是一樣的,今天寫過這道題後才頓悟 dp與遞迴不是一樣的。狀態方程dp n k min dp n 1 k dp n 2 k 1 w i w j 2 唉,終於發現思想上有所改變了,不過 實現能力不足,在對dp陣列初始化的問題上浪費了n多精力和時間 ...

HDU1421 搬寢室 線性dp

題目 又是一道,沒有思想的題,看了題解,我發現我的dp題幾乎都看了題解,我總是想不好狀態轉移方程,汗顏,以後怎麼比賽啊。先排序,然後說乙個數學問題。首先,要怎麼搬呢?即每一對要怎麼取?如果有abcd四個數,且a a c 2 b d 2 a b 2 c d 2 a d 2 b c 2 即每對物品都應是...

HDU 1421 搬寢室 類似揹包DP

思路 把重物從小到大排序,計算出每2個相鄰的重物產生的疲勞度,放在p i 陣列中,表示i與i 1這2個重物產生的疲勞度。dp i j 表示進行到第i個物品 i前面的物品不一定都選了,跟揹包差不多,i表示進行到第i個物品 已經選了j對物品 產生的最小疲勞度。初始化 先把所有值賦值為inf 無窮大 然後...