思路:
dp + 滾動陣列。
定義狀態為(當前第幾個磚塊, 兩堆磚塊高度差),於是就變成了和01揹包差不多的問題。
初始只有i = 0時,dp[n][i] = 0,否則dp[n][i] = -inf.
dp[i][j] = max(dp[i + 1][j], dp[i + 1][j - a[i]], dp[i + 1][j + a[i]] + a[i]).
(或者dp[i][j] = max(dp[i + 1][j], dp[i + 1][j - a[i]] + a[i], dp[i + 1][j + a[i]]).算哪堆都一樣)
注意j不要超出範圍。為了避免j為負數,要加個偏移量。
還有滾動陣列優化空間。
實現:
1 #include 2 #include 3 #include 4 #include 5using
namespace
std;67
const
int inf = 0x3f3f3f3f, maxn = 500000;8
int a[55], dp[2][2 * maxn + 1
], n;910
bool check(int
x)11
1415
intsolve()
1631}32
return dp[0
][maxn];33}
3435
intmain()
3642
int x =solve();
43if (x > 0) cout << x <44else puts("-1"
);45
return0;
46 }
2017網易春招 分餅乾(DP
易老師購買了一盒餅乾,盒子中一共有k塊餅乾,但是數字k有些數字變得模糊了,看不清楚數字具體是多少了。易老師需要你幫忙把這k塊餅乾平分給n個小朋友,易老師保證這盒餅乾能平分給n個小朋友。現在你需要計算出k有多少種可能的數值 輸入描述 輸入包括兩行 第一行為盒子上的數值k,模糊的數字用x表示,長度小於1...
9 塗棋盤 2017網易春招
程式設計題 塗棋盤 時間限制 1秒 空間限制 32768k 小易有一塊n n的棋盤,棋盤的每乙個格仔都為黑色或者白色,小易現在要用他喜歡的紅色去塗畫棋盤。小易會找出棋盤中某一列中擁有相同顏色的最大的區域去塗畫,幫助小易算算他會塗畫多少個棋格。輸入描述 輸入資料報括n 1行 第一行為乙個整數n 1 n...
10 小易記單詞 2017網易春招
程式設計題 小易記單詞 時間限制 1秒 空間限制 32768k 小易參與了乙個記單詞的小遊戲。遊戲開始系統提供了m個不同的單詞,小易記憶一段時間之後需要在紙上寫出他記住的單詞。小易一共寫出了n個他能記住的單詞,如果小易寫出的單詞是在系統提供的,將獲得這個單詞長度的平方的分數。注意小易寫出的單詞可能重...