動態規劃 貪心 剪草

2021-09-22 16:36:06 字數 1382 閱讀 8818

我們思考一下,當結束前如果草被割了兩次,其實可以將第一次留著不割,到第二次再割;因此每一草最多隻會被割一次,這樣才能夠保證結果的最優性。

其次,若要割兩個不同的草,並在不同的時間割除時,一定要先割生長速度的慢的草,再割快的草;因為在這乙份間隔的時間內,生長速度快的草可以被割掉的更多。

或者有另外的一種理解方式:

綜上所述,我們得到了乙份貪心策略,按照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 動態規劃

貪心 每一步都是當前這一步的最優解法,但是卻不一定是整個問題的最優子解 動態規劃 每一步不一定是當前這一步的最優解,但是卻一定是整個問題的最優子解 從 最短路徑 問題中,就可以看出,使用動態規劃是正確的 對於動態規劃的進一步的演算法理解,請見這位大佬的部落格 兩種方法 自頂向下 又稱記憶化搜尋 備忘...