雷濤的小貓題解

2021-09-01 18:12:10 字數 1543 閱讀 4049

雷濤同學非常的有愛心,在他的宿舍裡,養著乙隻因為受傷被救助的小貓(當然,這樣的行為是違反學生宿舍管理條例的)。在他的照顧下,小貓很快恢復了健康,並且愈發的活潑可愛了。?

可是有一天,雷濤下課回到寢室,卻發現小貓不見了!經過一番尋找,才發現她正趴在陽台上對窗外的柿子樹發呆…

在北京大學的校園裡,有許多柿子樹,在雷濤所在的宿舍樓前,就有n棵。並且這n棵柿子樹每棵的高度都是h。冬天的寒冷漸漸籠罩了大地,樹上的葉子漸漸掉光了,只剩下乙個個黃澄澄的柿子,看著非常喜人。而雷濤的小貓恰好非常的愛吃柿子,看著窗外樹上的柿子,她十分眼饞,於是決定利用自己敏捷的跳躍能力跳到樹上去吃柿子。

小貓可以從宿舍的陽台上跳到窗外任意一棵柿子樹的樹頂。之後,她每次都可以在當前位置沿著當前所在的柿子樹向下跳1單位距離。當然,小貓的能力遠不止如此,她還可以在樹之間跳躍。每次她都可以從當前這棵樹跳到另外的任意一棵,在這個過程中,她的高度會下降delta單位距離。每個時刻,只要她所在的位置有柿子,她就可以吃掉。整個「吃柿子行動」一直到小貓落到地面上為止。

雷濤調查了所有柿子樹上柿子的生長情況。他很想知道,小貓從陽台出發,最多能吃到多少柿子?他知道寫乙個程式可以很容易的解決這個問題,但是他現在懶於寫任何**。於是,現在你的任務就是幫助雷濤寫乙個這樣的程式。

圖為n=3,h=10,delta=2的乙個例子。小貓按照圖示路線進行跳躍,可以吃到最多的8個柿子

每棵樹的不同地方都有柿子,貓可以在所有的樹之間跳躍,可以選擇留在當前樹上並下降高度1,或選擇跳到其他樹上並下降高度delta,求最多可吃到的柿子。?

用mp記錄每棵樹的每個高度上的柿子數量 從上到下dp

dp[i][j]表示動態規劃做到第i棵樹第j高度時能吃到的最多柿子數

for(register int j=h;j>=0;j--)

if(mp[i][j])dp[i][j]+=mp[i][j];

}}

o(n

2∗h)

o(n^2*h)

o(n2∗h

)的演算法 ? 太慢了

然而可以通過jm去掉內層的k迴圈,jm[j]表示dp[1~n][j]的最大值

dp[i][j]=max(dp[i][j+1],jm[j+delta]);

–> 當前樹的j+1的高度與其他樹中(j+delta的高度)的最大值

從而優化成o(n

∗h

)o(n*h)

o(n∗h)

#include using namespace std;

const int maxn=5111;

int dp[maxn][maxn];

int n,h,delta;

int mp[maxn][maxn];

int jm[maxn]; //記錄同一高度上 所有樹中 對應dp值的最大值(降複雜度用)

int main()

} for(register int j=h;j>=0;j--)

} int ans=-9999999;

for(int i=0;i<=n;i++)

} cout

}

openjudge 雷濤的小貓

總時間限制 20000ms 單個測試點時間限制 10000ms 記憶體限制 65536kb 描述 雷濤同學非常的有愛心,在他的宿舍裡,養著乙隻因為受傷被救助的小貓 當然,這樣的行為是違反學生宿舍管理條例的 在他的照顧下,小貓很快恢復了健康,並且愈發的活潑可愛了。可是有一天,雷濤下課回到寢室,卻發現小...

bzoj1207 雷濤的小貓

有n 5000 棵柿子樹,每棵上面都有若干柿子且每棵樹高度均為h 5000 現在要從樹頂開始吃柿子,每次可以使自己的高度下降1,但是所在的樹沒變,或者換到任意一棵樹上,但是高度會降低delta,問到達地面 高度為0 時,最多能吃多少柿子 讀題之後,首先想到乙個最樸素的df 設f i j 表示當高度為...

BJWC2008 雷濤的小貓

嘟嘟嘟 dp。剛開始我想的是dp i j 表示在第 i 棵樹上,高度為h能吃到的最多的果子,如此能得到轉移方程 dp i j max dp i j 1 dp k j derta k 1 n k i 但因為這樣寫會導致dp k j derta k i 的部分沒有更新,所以應該把dp試的兩胃交換一下。這...