劃分為的子問題為: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,單位為美元 鋼條...