problem description
都說天上不會掉餡餅,但有一天gameboy正走在回家的小徑上,忽然天上掉下大把大把的餡餅。說來gameboy的人品實在是太好了,這餡餅別處都不掉,就掉落在他身旁的10公尺範圍內。餡餅如果掉在了地上當然就不能吃了,所以gameboy馬上卸下身上的揹包去接。但由於小徑兩側都不能站人,所以他只能在小徑上接。由於gameboy平時老呆在房間裡玩遊戲,雖然在遊戲中是個身手敏捷的高手,但在現實中運動神經特別遲鈍,每秒種只有在移動不超過一公尺的範圍內接住墜落的餡餅。現在給這條小徑如圖示上座標:
為了使問題簡化,假設在接下來的一段時間裡,餡餅都掉落在0-10這11個位置。開始時gameboy站在5這個位置,因此在第一秒,他只能接到4,5,6這三個位置中其中乙個位置上的餡餅。問gameboy最多可能接到多少個餡餅?(假設他的揹包可以容納無窮多個餡餅)
input
輸入資料有多組。每組資料的第一行為以正整數n(0
output
每一組輸入資料對應一行輸出。輸出乙個整數m,表示gameboy最多可能接到m個餡餅。
sample input
6sample output5 14 1
6 17 2
7 28 30
4這個題目看了之後可以立刻否定掉貪心思路,因為假設4,5,6位置餡餅個數一樣,依據貪心思路可隨便選一條,顯然不一定找到最優,因為你不知道4,5,6位置後面有哪些位置有更多的餡餅,貪心思路只面對當前,無法探測以後。想到這兒,便立即與數塔聯絡在一起,可以說此題就是數塔的變形,只是描述的複雜了些。模擬數塔,可以很快確定秒數即為本題的階段,某一階段的各個位置為該階段的狀態,如果設dp[i][j]為第i秒時在位置j可以接到的最大餡餅數,a[i][j]為在i,j處餡餅的數量,tmax為總秒數,那麼狀態轉移方程為:
dp[i][j]=max(dp[i+1][j-1],dp[i+1][j],dp[i+1][j+1])+a[i][j] (1<=idp[tmax][i]=a[tmax][i] (1<=i<=11)
注意我把邊界設為1到11是因為假定存在0位置與12位置(因為計算過程中可能會用到),但把整個dp事先都清零0和12存在也無妨,因為在1到11某個位置上不會出現負數。
這樣遞推下來,遞推到第一秒結束,題目要求0到10位置從5出發,由於本題的位置是1到11,因此從6出發,即找到最終的dp[1][5],dp[1][6],dp[1][7]的三者最大值。
#include#includeint n,x,tmp,dp[100002][13],a[100002][13];
int main()
for(i=1; i<=11; i++) //邊界
dp[t][i]=a[t][i];
for(i=t-1; i>=1; i--) //dp過程
for(j=1; j<=11; j++)
{tmp=0;
for(int k=j-1;k<=j+1;k++)
if(tmp
hdu 1176 免費餡餅 dp
去年暑假的時候就看到這個題了,當時太菜了。完全不知道做。今天看到了網上的hdu dp46題,準備暑假前把這46個題搞了,正好看到了這個免費餡餅,怒a之。狀態轉移方程 dp i j max dp i j max dp i 1 j max dp i 1 j 1 dp i 1 j 1 v i j 其中dp...
HDU1176 免費餡餅 DP
problem description 都說天上不會掉餡餅,但有一天gameboy正走在回家的小徑上,忽然天上掉下大把大把的餡餅。說來gameboy的人品實在是太好了,這餡餅別處都不掉,就掉落在他身旁的10公尺範圍內。餡餅如果掉在了地上當然就不能吃了,所以gameboy馬上卸下身上的揹包去接。但由於...
HDU1176 免費餡餅 DP
題目大意 區間 0,10 上掉落餡餅,每秒在乙個整數點上掉落乙個餡餅,gameboy第0秒在位置5,他在第一秒只能接到4,5,6這三個位置上的餡餅,問你最多可以接到多少餡餅。分析 數塔問題。我們以時間為橫座標,位置為縱座標建立乙個矩陣,那麼我們會發現,其實就是在 0,5 位置找到一條到達最底層的路徑...