動態規劃—problem g
題意 都說天上不會掉餡餅,但有一天gameboy正走在回家的小徑上,忽然天上掉下大把大把的餡餅。說來gameboy的人品實在是太好了,這餡餅別處都不掉,就掉落在他身旁的10公尺範圍內。餡餅如果掉在了地上當然就不能吃了,所以gameboy馬上卸下身上的揹包去接。但由於小徑兩側都不能站人,所以他只能在小徑上接。由於gameboy平時老呆在房間裡玩遊戲,雖然在遊戲中是個身手敏捷的高手,但在現實中運動神經特別遲鈍,每秒種只有在移動不超過一公尺的範圍內接住墜落的餡餅。現在給這條小徑如圖示上座標。
為了使問題簡化,假設在接下來的一段時間裡,餡餅都掉落在0-10這11個位置。開始時gameboy站在5這個位置,因此在第一秒,他只能接到4,5,6這三個位置中其中乙個位置上的餡餅。問gameboy最多可能接到多少個餡餅?(假設他的揹包可以容納無窮多個餡餅)
解題思路
設a[i][j]為第i秒的j位置掉下的餡餅數量,pie[i][j]為第i秒在j位置接餡餅最多可以接到的最多餡餅數量。由於每秒只能移動乙個位置,因此這一狀態可能由三種情況達到:
① pie[i - 1][j - 1]
② pie[i - 1][j]
③ pie[i - 1][j + 1]
這三種情況中的最大值加上當前位置可以接到的餡餅數即是當前位置可以接到的最大餡餅數量:
pie [ i ] [ j ] = max ( pie [ i - 1 ] [ j - 1 ] , pie [ i - 1 ] [ j ] , pie [ i - 1 ] [ j + 1 ] ) + a [ i ] [ j ] ;
可以看出,當前狀態與之前同一階段的多個狀態有關,而類似於 ugly numbers 等動態規劃中的每一階段都只有乙個狀態,為區分兩者,我將它稱為 二維動態規劃 。當然,這道題只是二維動態規劃中最簡單的一種罷了。
因此,狀態轉移為:
pie [ i ] [ j ] = max ( pie [ i - 1 ] [ j - 1 ] , pie [ i - 1 ] [ j ] , pie [ i - 1 ] [ j + 1 ] ) + a [ i ] [ j ] ;
感想 幾天前做的,結果一時忘了寫部落格,補上。
ac**
#include
#include
#include
using
namespace
std ;
int a [ 100001 ] [ 12 ] ;
int f [ 100001 ] [ 12 ] ;
int main ( )
f [1] [4] = a [1] [4] ;
f [1] [5] = a [1] [5] ;
f [1] [6] = a [1] [6] ;
for ( i = 2 ; i <= maxt ; ++ i )
} for ( i = 0 ; i < 11 ; ++ i )
ans = max ( ans, f [maxt] [i] ) ;
cout
0 ;
}
Problem G 逃脫 搜尋)
problem g 逃脫 time limit 1 sec memory limit 32 mb submit 341 solved 36 submit status web board description 這是mengxiang000和tabris來到幼兒園的第四天,幼兒園老師在值班的時候突然...
Problem G 貨幣兌換
problem g 貨幣兌換 time limit 1 sec memory limit 2 mb submit 14369 solved 6327 submit status web board description 給出人民幣對美元 歐元 日元的當日匯率,求給定金額的人民幣能兌換成外幣的金額,...
動態規劃 什麼是動態規劃?
先來看看 資訊學奧賽一本通第5版 是怎麼說的 動態規劃程式設計是對解最優化問題的一種途徑 一種方法,而不是一種特殊演算法。不像前面所述的那些搜尋或數值計算那樣,具有乙個標準的數學表示式和明確清晰的解題方法。動態規劃程式設計往往是針對一種最優化問題,由於各種問題的性質不同,確定最優解的條件也互不相同,...