動態規劃之灌溉草場

2021-08-19 04:11:37 字數 1198 閱讀 7405

劃分為的子問題為:f[x]表示噴灑範圍恰好覆蓋直線上的區間[0,x]時,最少需要多少個噴頭。

x需要滿足以下條件:

1.x為偶數

2.x不位於任何奶牛的活動範圍內

3.x>=2a

4.當x>2b時,存在y∈[x-2b,x-2a]且滿足上述條件時,f[x] = f[y] +1(狀態轉移方程)

我們借助於優先順序佇列來找最小的f[y]

當求f[x]時,必須保證佇列中的點的座標必須位於[x-2b,x-2a]的範圍內,

完全不允許點的座標大於x-2a

當點的座標小於x-2a時,pop出去即可

當求完f[x]時,可將二元組(x-2a+2,f(x-2a+2))放入佇列,為下次求解做準備。

如何判斷乙個點是否在奶牛的活動範圍內,可以用o(n)時間複雜度的程式完成

#include#include #include #include #include #include using namespace std;

const int infinite = 1<<31;

const int maxl = 1000005;

const int maxn = 1005;

int cowvary[maxl];//cowvary[i]表示當從i的左邊進入到右邊時,奶牛增加的數量

int isthere[maxl];//判斷該點是否在某個奶牛的活動範圍內

int f[maxl];//存最後的答案

struct node

friend bool operator

};priority_queue qf;

int main()

int cownum = 0;

for(int i=0; i<=l; i++)

/**佇列初始化**/

for(int i=a; i<=b; i++)}}

for(int i=b+2; i<=l; i+=2)

if(!qf.empty())

}if(f[i-a+2]!=infinite)

}if(f[l]==infinite)

cout<

else

cout<

return 0;

}

灌溉草場POJ2373

灌溉草場poj2373 偽 思路 具體分析根據老師動歸課件,這裡給出ac原始碼用f x 表示到x時最小水管數。if isodd x f x inf if x 2a f x infif inarea x f x inf if x 2a x 2b inarea x f x 1 if x 2b f x m...

演算法之動態規劃

一 思想 首先要了解 動態規劃 必須先知道什麼叫做 多階段決策 百科裡面對這個問題解釋的很全,我就load一段出來,大家得要好好品味,好好分析。上面圖中最後一句話就定義了動態規劃是要幹什麼的問題。二 使用規則 現在我們知道動態規劃要解決啥問題了,那麼什麼情況下我們該使用動態規劃呢?最優化原理 最優子...

演算法之動態規劃

鋼條切割問題 鋼條切割問題出現在 演算法導論 一書第204頁,作為動態規劃的例題出現,該題內容如下 serling公司購買長鋼條,將其切割為短鋼條 切割工序本身沒有成本支出。公司管理層希望知道最佳的切割方案。假定我們知道serling公司 一段長為i英吋的鋼條的 為pi i 1,2,單位為美元 鋼條...