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