題目鏈結 ----------><-------------
題目分析:
有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 56using
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...