P1156 垃圾陷阱

2022-04-29 21:51:11 字數 1370 閱讀 1837

一道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 英呎。卡門想把垃圾堆起來,等到堆得與井同樣高時,她就能逃出井外了。另外,卡門可以通過吃一些垃圾來維持自己的生命。每個垃圾都可以用來吃或堆放,並且堆放垃圾不用花費卡門...