p1156 題解(未完全解決)

2022-06-03 21:18:09 字數 1641 閱讀 4991

卡門――農夫約翰極其珍視的一條holsteins奶牛――已經落了到「垃圾井」中。「垃圾井」是農夫們扔垃圾的地方,它的深度為d(2 \le d \le 100)d(2≤d≤100)英呎。

卡門想把垃圾堆起來,等到堆得與井同樣高時,她就能逃出井外了。另外,卡門可以通過吃一些垃圾來維持自己的生命。

每個垃圾都可以用來吃或堆放,並且堆放垃圾不用花費卡門的時間。

假設卡門預先知道了每個垃圾扔下的時間t(0< t \le 1000)t(0輸入格式:

第一行為22個整數,dd和 g (1 \le g \le 100)g(1≤g≤100),gg為被投入井的垃圾的數量。

第二到第g+1g+1行每行包括33個整數:t (0 < t <= 1000)t(0輸出格式:

如果卡門可以爬出陷阱,輸出乙個整表示最早什麼時候可以爬出;否則輸出卡門最長可以存活多長時間。

輸入樣例#1: 複製

20 4

5 4 9

9 3 2

12 6 10

13 1 1

輸出樣例#1: 複製

13
如果卡門可以爬出陷阱,輸出乙個整表示最早什麼時候可以爬出;否則輸出卡門最長可以存活多長時間。

dp實錘。(走出門,就與dp撞了個滿懷,題面裡含著揹包的氣息,夜裡,好清爽!)

經過一通胡思亂想,我覺得狀態應該是血量。(事實證明確實是血量)

然後好像就比較明朗了。

直接列舉當前高度的血量。但是方程好像有點迷、、、

列舉高度(i),列舉n(j)。dp[i]表視當前高度的血量。

dp[墊乙個草塊]=max(dp[扔下來乙個草塊吃],dp[扔下來乙個草塊不吃,墊])

劃重點!!!!!!!!!!!!!!!!

dp[i]+=e[i].f;

這是我沒有想到的(雖然後來看也就是這麼回事)

坑點:1、輸入不按照時間順序,所以要排序。

2、當dp[i]=0時,奶牛處於瀕死狀態,所以要初始化-1

未解決的問題:

1、為何j的列舉要倒序?

#include#include

#include

using

namespace

std;

const

int maxn=10005

;int dp[maxn];//

i=height;dp[i]=life

intn,m;

intmaxm;

struct

node

e[maxn];

bool

cmp(node a,node b)

intmain()

sort(e+1,e+m+1

,cmp);

memset(dp,-1,sizeof

(dp));

dp[0]=10

;

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

dp[j+e[i].h]=max(dp[j],dp[j+e[i].h]);

dp[j]+=e[i].f;}}

}//for(int i=1;i<=n;i++)

printf("

%d",dp[0

]);

return0;

}

P1156 垃圾陷阱

這是一道揹包,但是對於放東西有條件限制 首先思考,對於每乙個物品,除非放不了,否則就要放,不放上就吃掉,肯定不能扔那不管 我們定義dp i j 為第i個物品,高度為j的時候能活的最長時間,那麼整個轉移過程就是 for int i 1 i g i ans max ans,dp i 0 最大時間肯定是全...

P1156 垃圾陷阱

設 f i j 表示,扔進去 i 個垃圾,垃圾高度為 j 時,奶牛的生命值。初始化 f 陣列為 1,因為當奶牛生命值為 0 時,奶牛還是可以操縱垃圾。f 0 0 10 為奶牛的初始生命值。轉移如下 當 f i j 0 時,說明這個狀態奶牛已經死了,跳過。當 f i j 0 時,奶牛處於瀕死狀態,還可...

P1156 垃圾陷阱

一道dp難題 鑑於我最近學了dp,所以就在訓練裡找了到dp題 在debug乙個多小時之後,我發現好水好難啊!上連線 p1156 乙隻腦殘奶牛把自己弄到深度為d的垃圾井裡,而且它一開始只能活10小時,所以它莫名其妙知道了垃圾倒下的t 時間 和h 高度 對於每個垃圾,它要麼吃了 口區 要麼堆高高,從而逃...