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分鐘作為...