二維DP hdu 1421 搬寢室問題

2022-04-30 11:57:12 字數 1196 閱讀 2539

題目鏈結 ----------><-------------

題目分析:

有n樣東西,需要搬k次,每次搬兩個,搬2*k個 ,求最少力氣。很明顯絕對值差值越小越好,於是讀入n個物品質量後排序,每乙個物品只有可能與前乙個物品或後乙個物品一起搬,絕對值才是可能當前最小。於是有dp思路,二維dp 陣列 dp[i][j]表示,到達選擇第i個物品時,已經選了j對成功的物品的最小力氣。

當到達第i個物品時,可以選擇是否選擇搬動該物品 。所以有轉移方程dp[i][j] = min(dp[i - 2][j - 1] + (a[i - 1] - a[i - 2])^2,dp[i - 1][j]);當然選擇第i個物品時,可以規定j的範圍,2*j <= i 已經選過的總物品數至少為選中對數兩倍。由於這裡取小值,全初始為0並不好,應當初始為乙個極大值inf = 0x3f3f3f3f;舉個例子 當選過第六個物品,前面成功選了3對時:  dp[6][3] = min(dp[4][2] + (a[5] - a[4])^2 , dp[5][3]); 然而我們明白dp[5][3] 在前面並不會迴圈到,因為有限制條件 2*j <= i; 如果全初始化為0,那麼這個選取最小值就會出錯(為0)所以我們將

其dp全初始化為最大值。然後只有 dp[i][0] = 0 (到達任何乙個物品,前面選了0對,最小值為0)。最後 輸出選到n個物品,選了k對的值就可以。也就是dp[n][k];

**君:

1 #include 2 #include 3 #include 4 #include 56

using

namespace

std;

7#define max 2010

8#define m (a[i - 1] - a[i - 2])

9#define inf 0x3f3f3f3f

1011

intdp[max][max];

12int

a[max];

13int min(int a , int b)

14int

n , k;

15void

init()

1621

2223

intmain()

2439}40

41 cout << dp[n][k] <43return0;

44 }

經典DP HDU 1421 搬寢室

題解 用dp i j 代表從i個數中取j對數,首先我們對給定的數排乙個序,使取答案的時候,區域性最優,因為我們有取或者不取兩種狀態,所以當不取的時候我們當前狀態等於上乙個狀態,dp i 1 j 當取的時候,我們上乙個狀態為dp i 2 j 1 代表i 2個數取j 1對數加上取的sqr a i a i...

解決二維陣列轉為ArrayList集合問題

string str arraylistlist new arraylist for int i 0 i str.length i system.out.println list 控制台輸出結果 語文,100,英語,90,數學,90 這很明顯是沒有得到想要的結果的,預期的需求是乙個科目及分數為乙個實...

二維陣列的查詢 面試常問

題目描述 在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。public class solution else if array i mid target e...