題意描述:
john現有h個小時的空閒時間,他打算去釣魚。john釣魚的地方共有n個湖,所有的湖沿著一條單向路順序排列(john每在乙個湖釣完魚後,他只能走到下乙個湖繼續釣), john必須從1號湖開始釣起,但是他可以在任何乙個湖結束他此次釣魚的行程。john在每個湖中每5分鐘釣的魚數(此題中以5分鐘作為單位時間),隨時間的增長而線性遞減。而每個湖中頭5分鐘可以釣到的魚數以及每個湖中相鄰5分鐘釣魚數的減少量,input中均會給出。並且john從任意乙個湖走到它下乙個湖的時間input中也都給出。
問題:求一種方案,使得john在有限的h小時中可以釣到盡可能多的魚。
output中需包括john在所有湖邊所呆的時間,以及最後總的釣魚數。
演算法分析:
由於每個湖都必須經過,且只經過一次,所以john花在路中的總時間是確定的。
在這個條件下,可以想成john學會了「瞬間移動」,即:他可以在任何時間,移動到任何他想去的湖,而移動的過程無需時間。
於是,john只需在每個5分鐘的開始「瞬間移動」到當前5分鐘中能釣到最多的魚的湖中,且只釣5分鐘的魚。
這樣可以保證john釣到盡可能多的魚。
只要列舉john的行程是從第乙個湖到第k個湖(1<=k<=n),比較出最大的釣魚數,就是題目所求的最佳方案。
貪心演算法:
每次選擇乙個區域性最優策略進行實施,而不去考慮對今後的影響。
實質是列舉加貪心演算法的應用,兩種演算法混用在校賽裡面作為壓軸題,這個要小心
#include #include #define maxn 26 using namespace std; int t[maxn]=,f[maxn],f[maxn],d[maxn],ans[maxn],ans[maxn]; //ans為列舉過程中記錄每個湖應該停留時間,ans為最優的結果 int main() memset(ans,0,sizeof(ans)); for (max = 0 , i = 1;i <= n;i++)//列舉,max記錄最多魚的數目 for (j = 0,sum = 0;j < h - t[i-1];j++)//減去在湖之間所走的時間,相當於瞬間轉移 } if (f[p] <= 0) sum+=f[p];//計算釣到魚的總數 f[p]-=d[p];//水池裡面魚減少後的數目 ans[p]++;//對應池塘釣魚時間+1 } if (sum > max) if (sum == max) } if (ans[j] > ans[j]) } } for (i = 0;i < n-1;i++) { cout<
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 釣魚問題 貪心列舉及動態規劃
題意描述 john現有h個小時的空閒時間,他打算去釣魚。john釣魚的地方共有n個湖,所有的湖沿著一條單向路順序排列 john每在乙個湖釣完魚後,他只能走到下乙個湖繼續釣 john必須從1號湖開始釣起,但是他可以在任何乙個湖結束他此次釣魚的行程。john在每個湖中每5分鐘釣的魚數 此題中以5分鐘作為...
poj 1042 貪心演算法
poj 1042 gone fishing 題目要求 由有n個湖,按照順序排列,乙個人從第乙個湖向最後乙個湖行進 方向只能從湖0到湖n 1 途中可以在湖中釣魚。在每個湖中釣魚時,開始的5分鐘內可以釣到 f i 條,之後每5分鐘釣到的魚數目遞減 d i 且每兩個相鄰的湖的距離 t i 給出 t i 表...