經歷了一次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 ...