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 ...