一道dp難題······
鑑於我最近學了dp,所以就在訓練裡找了到dp題
在debug乙個多小時之後,我發現好水好難啊!!!
上連線:p1156
乙隻腦殘奶牛把自己弄到深度為d的垃圾井裡,而且它一開始只能活10小時,
所以它莫名其妙知道了垃圾倒下的t(時間)和h(高度),
對於每個垃圾,它要麼吃了(口區),要麼堆高高,從而逃脫,
p.s.吃了能多活v小時。
輸出:若能或者逃脫,就輸出最早逃脫時間,若逃不了,就輸出餘生的最長時間。(莫名悲傷)
都說是dp了,那麼······推方程吧。
首先,用dp[i][j]表示i個垃圾,堆j高的最大生命值
然後,分兩種情況:
$if(dp[i][j]>=trash[i+1].t-trash[i].t) $ p.s.這個判斷不可少
拿來堆:\(dp[i+1][j+trash[i+1].h]=max(dp[i+1][j+trash[i+1].h],dp[i][j]-(trash[i+1].t-trash[i].t));\)
拿來吃:\(dp[i+1][j]=max(dp[i+1][j],dp[i][j]+trash[i+1].v-(trash[i+1].t-trash[i].t));\)
(插一句:這次的方程有些不同,這次是用i,j重新整理後面的值,簡稱刷表)
\(dp[0][0]=10;\)
其它\(dp\)都是-1。
在粘**之前,說一下輸出,在迴圈中判斷:
if(dp[i+1][j+trash[i+1].h]>=0&&j+trash[i+1].h>=d)
所以剩下的就是,它出不去的情況···(再次莫名悲傷)
具體見**;
#include#include#includeusing namespace std;
int d,g,dp[110][1100],ans=0;
struct hoptrash[110];
bool cmp(hop a,hop b)
if(dp[i+1][j+trash[i+1].h]>=0&&j+trash[i+1].h>=d)
}if(dp[i][0]!=-1)
maxt=max(maxt,dp[i][0]+trash[i].t);
} if(dp[g][0]!=-1) maxt=max(maxt,dp[g][0]+trash[g].t);
printf("%d\n",maxt);
return 0;
}
不說了,再次莫名悲傷······ P1156 垃圾陷阱
這是一道揹包,但是對於放東西有條件限制 首先思考,對於每乙個物品,除非放不了,否則就要放,不放上就吃掉,肯定不能扔那不管 我們定義dp i j 為第i個物品,高度為j的時候能活的最長時間,那麼整個轉移過程就是 for int i 1 i g i ans max ans,dp i 0 最大時間肯定是全...
P1156 垃圾陷阱
設 f i j 表示,扔進去 i 個垃圾,垃圾高度為 j 時,奶牛的生命值。初始化 f 陣列為 1,因為當奶牛生命值為 0 時,奶牛還是可以操縱垃圾。f 0 0 10 為奶牛的初始生命值。轉移如下 當 f i j 0 時,說明這個狀態奶牛已經死了,跳過。當 f i j 0 時,奶牛處於瀕死狀態,還可...
洛谷 P1156 垃圾陷阱
卡門 農夫約翰極其珍視的一條holsteins奶牛 已經落了到 垃圾井 中。垃圾井 是農夫們扔垃圾的地方,它的深度為d 2 d 100 英呎。卡門想把垃圾堆起來,等到堆得與井同樣高時,她就能逃出井外了。另外,卡門可以通過吃一些垃圾來維持自己的生命。每個垃圾都可以用來吃或堆放,並且堆放垃圾不用花費卡門...