luogu P1156 垃圾陷阱

2022-08-13 09:27:09 字數 1014 閱讀 1574

經歷了一次ce,兩次wa 45,一次wa 91,終於a掉了此題。

f[i][j]表示前i個物品堆成j高度時的生命值。

對於每一件物品,都有吃掉或是把它堆起來兩種方案。

如果奶牛堅持不到吃到下乙個物品,那麼就無需進行此次轉移。

而如果不吃而將其堆起來,高度超過了井的深度,那麼由於是1—n列舉的,所以此時的時間就是最快脫逃的時間,

而如果堆起來不能超過深度的話,就要同時考慮兩種選擇。

如果將其吃掉,那麼f[i][j]=max(f[i-1][j]+p[i].e,f[i][j])

而將其堆起來的話,f[i][j+p[i].h]=max(f[i][j+p[i].h],f[i-1][j])

如果始終無法到達,那麼就不妨選擇全部吃掉,直到全部吃完或是堅持不到吃到下乙個。

#include#include

#include

using

namespace

std;

struct

thp[

105];

bool

cmp(th x,th y)

int max(int x,int

y)int h,n,f[1005][1005

],t;

intmain()

f[i][j]=max(f[i][j],f[i-1][j]+p[i].e);

f[i][j+p[i].h]=max(f[i][j+p[i].h],f[i-1

][j]);}}

for(int i=1;i<=n;i++) t=max(t,f[i][0

]); printf("%d

",t);

return0;

}

Luogu P1156 垃圾陷阱 DP

f i j 表示在第i個垃圾,高度為j的最大生命值 轉移分三部分 如果j 當前垃圾的高度,且兩個垃圾間的時間小於等於上乙個狀態f i 1 j a i v 的生命值,則可以墊高度 如果j 當前垃圾的高度,且兩個垃圾間的時間小於等於上乙個狀態f i 1 j 的生命值,則可以吃 如果j 當前垃圾的高度,且...

題解 luogu p1156 垃圾陷阱

揹包 總結 1.狀態要根據問的問題設計,一開始我設計dp i 是在i時間時的最高高度,而題目卡門最長可以活多久,這樣設計的話若不能出去,則這個不好判斷。所以設計為dp i 是在i的高度時,卡門最多可以後活多久,這樣問題便迎刃而解。2.不用將牛的壽命減去時間,直接將牛可以存活的時間與當前時間比較即可。...

LUOGU P1156 垃圾陷阱(揹包變形)

首先應該看得出是乙個揹包吧 那dp陣列的第一維肯定有前i個物品 那第二維放啥呢?血量?高度?時間?時間是完全可以排除的,因為牛肯定是在辣雞剛掉下的時候就使用它,而且對於subtask1 如果卡門可以爬出陷阱,輸出乙個整數表示最早什麼時候可以爬出 答案肯定剛好是某個辣雞下落的時間 血量呢?設dp i ...