poj 1042 貪心演算法

2022-04-28 18:51:08 字數 2414 閱讀 7637

poj 1042 gone fishing

題目要求:

由有n個湖, 按照順序排列,乙個人從第乙個湖向最後乙個湖行進(方向只能從湖0到湖n-1),途中可以在湖中釣魚。在每個湖中釣魚時,開始的5分鐘內可以釣到 f[i] 條,之後每5分鐘釣到的魚數目遞減 d[i] ,且每兩個相鄰的湖的距離 t[i] 給出(t[i] 表示 由第 i 個湖向第 i + 1個湖行進在路上花費5分鐘的倍數的時間, 即如果t[3] = 4,則表示從第三個湖向第四個湖行進需要花費20分鐘)。 現給定總時間h 小時,求出在每個湖釣魚時間的最好的方案,使得釣魚的總數最多,如果兩種方案結果相同,則輸出在較小序號的湖中釣魚時間更多的那個。

題目分析:

最優化問題,可以選擇動態規劃或者貪心演算法,初看起來,是個多階段的決策問題,且每個階段會對下乙個階段產生影響,並不好找到合適的貪心策略,更適合採用動態規劃。先考慮動態規劃演算法,可以考慮 動規陣列 dp[t][n] 表示在 t 時刻到達湖 n 時之前釣魚結果的最優值,可以找出遞推關係式 dp[t][n] =  max

即對到達湖 n - 1的時刻 t1 進行列舉(在一定的範圍之內,小於 t - t[n-1], 大於xx),然後取出最大值作為 dp[t][n],這樣從 n - 1 推到 n。

個人認為這種動態規劃的方法是可行的,但是。。由於水平太菜。。沒有成功。。

考慮採用貪心的演算法來實現,仔細分析一下,當確定了需要到達的湖的個數n,也就確定了在路上需要消耗的時間,從而得到釣魚的總時間,這樣在規定的時間內釣魚,每次都選擇當前5分鐘內收益最大的那個湖進行釣魚(可以採用優先順序佇列  priority_queue 來實現)。 考慮到這樣做會有可能出現先在湖 a 中釣魚,再在湖b中釣魚,然後再回到湖a中釣魚... 但是這樣不會影響最終的結果(這也是貪心演算法可以運用到此題的前提)。因為,雖然只能從湖0到湖n-1行進,此時進行貪心選擇雖然每次選擇的順序可能不斷顛倒變化,但是這只是確定湖a有幾次被選中釣魚,也就是確定從湖0到湖n-1每個湖中釣魚的時間。在實際行進途中釣魚的時候,就按照貪心算出來的方案(在湖 i 中釣魚幾次),在途中的湖中釣魚。

通過固定要經過的湖的個數n,將每個湖由於在路上消耗時間的差異去掉,使得面臨的選擇無差異,可以運用貪心演算法。

實現**:

#include#include#include#include#includeusing namespace std;

#define max_interval_num 200

#define max_lake_num 25

int dist_time[max_lake_num];

int min_dist_time[max_lake_num];

int stay_times[max_lake_num];

int init_num[max_lake_num];

int dec_num[max_lake_num];

struct lakenode;

lakenode lake_nodes[max_lake_num];

struct cmp

return lake1->cur_fish_amount < lake2->cur_fish_amount;

}};void clearqueue(priority_queue, cmp>& queue)

}int resolve(int n, int t)

clearqueue(lake_queue);

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

while(! lake_queue.empty() && fish_time > 0)

if (lake->cur_fish_amount <= 0)

lake->stay_time ++;

fish_time --;

lake_queue.push(lake);

}if (result > max_amount)}}

return max_amount;

}int main()

cin >> h;

h = h*12;

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

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

min_dist_time[0] = 0;

cin >> dist_time[0];

for(int i = 1; i < n - 1; i ++)

min_dist_time[n-1] = min_dist_time[n-2] + dist_time[n-2];

int result = resolve(n, h);

cout << stay_times[0]*5 ;

for(int i = 1; i < n; i ++)

cout << endl << "number of fish expected: " << result << endl << endl;

}return 0;

}

POJ 1042 貪心 DP 釣魚問題)

被這個題虐的一塌糊塗啊,時間有兩個世紀那麼長 有dp和貪心兩種解法 下面dp 狀態轉移方程 dp i j max dp i j dp i 1 j ti i k 但是因為memset dp,1,sizeof dp 所以寫的時候是 dp i 1 j k ti i max dp i j sum,dp i ...

POJ 1042 解題報告

題目要求 一條路上有n個湖。john剛開始在第1個湖。他可在其中選擇若干湖來釣魚。每到達乙個湖,他或者直接走過去下乙個湖,或者停留釣魚。釣魚的時間必須為5分鐘的倍數 已知第i個湖到第i 1個湖需行t i 時間。每個湖內初始有魚的數目為f i 當在第i個湖釣魚時,每過5分鐘,該湖魚的數目以d i 的速...

POJ 1042 釣魚問題 貪心列舉及動態規劃

題意描述 john現有h個小時的空閒時間,他打算去釣魚。john釣魚的地方共有n個湖,所有的湖沿著一條單向路順序排列 john每在乙個湖釣完魚後,他只能走到下乙個湖繼續釣 john必須從1號湖開始釣起,但是他可以在任何乙個湖結束他此次釣魚的行程。john在每個湖中每5分鐘釣的魚數 此題中以5分鐘作為...