Luogu P1156 垃圾陷阱 DP

2022-03-30 08:04:45 字數 810 閱讀 1565

f[i][j]表示在第i個垃圾,高度為j的最大生命值

轉移分三部分:

如果j>=當前垃圾的高度,且兩個垃圾間的時間小於等於上乙個狀態f[i-1][j-a[i].v]的生命值,則可以墊高度

如果j>=當前垃圾的高度,且兩個垃圾間的時間小於等於上乙個狀態f[i-1][j]的生命值,則可以吃

如果j《當前垃圾的高度,且兩個垃圾間的時間小於等於上乙個狀態f[i-1][j]的生命值,則可以吃

什麼時候死的:f[i][0]相當於沒有墊高度,拿這個狀態再把現在的垃圾吃了,可能是最優解,與ans取乙個max就好了

#include#include

#include

#include

#include

#define r register int

using

namespace

std;

int v,n,ret=0xcfcfcfcf

;int f[1001][101

];struct

node

}a[101

];inline

intg()

signed main()

}for(r j=a[i].v-1;j>=0;j--) if(f[i-1][j]>=a[i].t-a[i-1].t) f[i][j]=max(f[i][j],f[i-1][j]-(a[i].t-a[i-1].t)+a[i].w);

ret=max(ret,f[i][0]+a[i].t);

}printf(

"%d\n

",ret);

}

luogu P1156 垃圾陷阱

經歷了一次ce,兩次wa 45,一次wa 91,終於a掉了此題。f i j 表示前i個物品堆成j高度時的生命值。對於每一件物品,都有吃掉或是把它堆起來兩種方案。如果奶牛堅持不到吃到下乙個物品,那麼就無需進行此次轉移。而如果不吃而將其堆起來,高度超過了井的深度,那麼由於是1 n列舉的,所以此時的時間就...

題解 luogu p1156 垃圾陷阱

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

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

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