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

2022-05-04 09:12:13 字數 992 閱讀 9881

首先應該看得出是乙個揹包吧

那dp陣列的第一維肯定有前i個物品

那第二維放啥呢?血量?高度?時間?

時間是完全可以排除的,因為牛肯定是在辣雞剛掉下的時候就使用它,而且對於subtask1"如果卡門可以爬出陷阱,輸出乙個整數表示最早什麼時候可以爬出",答案肯定剛好是某個辣雞下落的時間

血量呢?設dp[i][j]代表前i件物品處理後能苟到j時間(其實相當於j血量)達到的最大高度

則有dp[i][j]=max(dp[i−1][j]+trash[i].h,dp[i−1][j+trash[i].c]) //前一種狀態相當於墊腳,後一種是拿來續命

然而對於j的取值,題目中並沒有明確的給出,並不好列舉,所以只有高度了

設dp[i][j]代表前i件物品處理後在j高度時能苟住的最長時間

則有 dp[i][j]=max(dp[i−1][j]+trash[i].c,dp[i−1][j−trash[i].h]) //前一種續命,後一種墊腳

j只需要從0~d列舉即可 注意在轉移的時候 需要先判斷上乙個階段到底能不能苟到這個垃圾掉下來的時候

#include#define n 105

using namespace std;

int d,g,dp[n][1005];

struct node

trash[n];

inline bool cmp(const node &a,const node &b)

sort(trash+1,trash+g+1,cmp);

memset(dp,-1,sizeof(dp));

dp[0][0]=10;

for(int i=1;i<=g;i++) }

int max_height=0;

int max_time=0;

for(int i=1;i<=g;i++)

if(max_height==d)

}cout

}

luogu P1156 垃圾陷阱

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

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.不用將牛的壽命減去時間,直接將牛可以存活的時間與當前時間比較即可。...