bzoj1207 雷濤的小貓

2021-07-07 02:11:11 字數 1259 閱讀 5222

n ( 5000 )棵柿子樹,每棵上面都有若干柿子且每棵樹高度均為h ( 5000 ),現在要從樹頂開始吃柿子,每次可以使自己的高度下降1,但是所在的樹沒變,或者換到任意一棵樹上,但是高度會降低delta,問到達地面 ( 高度為0) 時,最多能吃多少柿子

讀題之後,首先想到乙個最樸素的df:設f[ i ][ j ]表示當高度為j時,在第i棵樹上能吃到的最大的柿子數。轉移是顯然的 :f[ i ][ j ] = max(f[ i ][ j + 1 ], max(f[ k ][ j + delta ])) + h[ i ][ j ] (1 <= k <= n),其中h[ i ] [ j ]表示第i棵樹上高度為j的柿子有多少個,在讀入的時候統計一下就行了。總時間複雜度為o( n ^ 3 ) =狀態n ^ 2+ 轉移o( n )

但是由於n = 5000, h  = 5000,所以o( n ^ 3 )的複雜度太高。那麼如何優化呢?其實只需要記乙個g[ i ]陣列,表示在當前高度第i棵樹上的能吃到的最多柿子數。每次更新一下g[i] = max(g[ i ], f[ j - delta ]),比較一下是應該從當前這棵下來,還是從別的樹上跳過來。這樣狀態數還可以降到o( n ):f[ j ]表示到高度為 j 的時候能得到的最大柿子數。總時間複雜度o( n ^ 2 )

#include #include #include using namespace std;

const int max_n = 2005;

int n, h, del;

int h[max_n][max_n], f[max_n], g[max_n];

void init() }}

void doit()

printf("%d\n", f[0]);

}int main()

BZOJ 1270 雷濤的小貓 dp

題目大意 雷濤的小貓雷濤同學非常的有愛心,在他的宿舍裡,養著乙隻因為受傷被救助的小貓 當然,這樣的行為是違反學生宿舍管理條例的 在他的照顧下,小貓很快恢復了健康,並且愈發的活潑可愛了。可是有一天,雷濤下課回到寢室,卻發現小貓不見了!經過一番尋找,才發現她正趴在陽台上對窗外的柿子樹發呆 在北京大學的校...

openjudge 雷濤的小貓

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

雷濤的小貓題解

雷濤同學非常的有愛心,在他的宿舍裡,養著乙隻因為受傷被救助的小貓 當然,這樣的行為是違反學生宿舍管理條例的 在他的照顧下,小貓很快恢復了健康,並且愈發的活潑可愛了。可是有一天,雷濤下課回到寢室,卻發現小貓不見了!經過一番尋找,才發現她正趴在陽台上對窗外的柿子樹發呆 在北京大學的校園裡,有許多柿子樹,...