我們思考一下,當結束前如果草被割了兩次,其實可以將第一次留著不割,到第二次再割;因此每一草最多隻會被割一次,這樣才能夠保證結果的最優性。
其次,若要割兩個不同的草,並在不同的時間割除時,一定要先割生長速度的慢的草,再割快的草;因為在這乙份間隔的時間內,生長速度快的草可以被割掉的更多。
或者有另外的一種理解方式:
綜上所述,我們得到了乙份貪心策略,按照gro
wgrow
grow
值從小到大的順序進行切割。
然後我們進行dpdp
dp,設f [i
][j]
f[i][j]
f[i][j
]表示前i株草割了j株的最大切割數。
狀態轉移方程:f[i
][j]
=max
(f[i
−1][
j],f
[i−1
][j−
1]+h
[i]+
grow
[i]∗
j).f[i][j]=max(f[i-1][j],f[i-1][j-1]+h[i]+grow[i]*j).
f[i][j
]=ma
x(f[
i−1]
[j],
f[i−
1][j
−1]+
h[i]
+gro
w[i]
∗j).
但是我們具體不知道第一天才能夠完成,我們只要列舉這乙個天數,用day
∗sum
grow
+sum
h≥f[
n][d
ay]day*sum_+sum_≥f[n][day]
day∗su
mgro
w+s
umh
≥f[n
][da
y]是否合法即可。
**如下:
#include
using
namespace std;
int n,h;
int sum =0;
int sgrow =0;
int f[
100]
[100];
struct node};
node a[
100]
;int
main
(void
)
動態規劃 貪心
區別 動態規劃 全域性最優解中一定包含某個區域性最優解,但不一定包含前乙個區域性最優解,因此需要記錄之前的所有最優解。條件 最優子結構 重疊子問題。方法 自底向上構造子問題的解。例子 子串行最大和問題,滑雪問題 貪心演算法 條件 每一步的最優解一定依賴上一步的最優解。方法 從問題的某乙個初始解出發逐...
動態規劃和貪心
貪心演算法是種策略,思想。它並沒有固定的模式 比如最簡單的揹包問題 用貪心的思想去做,就可能有很多種方法 價效比最高的 價值最高的 重量最輕的 而你沒辦法確保你所選擇的貪心策略對所有的情況都是絕對最優的 動態規劃的思想是分治 解決沉餘 把乙個複雜的問題分解成一塊一塊的小問題 每乙個小問題中得到最優解...
貪心 VS 動態規劃
貪心 每一步都是當前這一步的最優解法,但是卻不一定是整個問題的最優子解 動態規劃 每一步不一定是當前這一步的最優解,但是卻一定是整個問題的最優子解 從 最短路徑 問題中,就可以看出,使用動態規劃是正確的 對於動態規劃的進一步的演算法理解,請見這位大佬的部落格 兩種方法 自頂向下 又稱記憶化搜尋 備忘...