動態規劃 免費餡餅

2021-08-02 16:47:04 字數 1895 閱讀 8438

由數塔引出。

數塔:

處於乙個端點,每次可以選擇向左或向右。

而每次選擇,取決於,向左能夠得到最大值,還是向右能得到最大值。

當到達數塔倒數第二行時,向左還是向右,僅僅取決於,向左的端點數值大還是向右的大。

自頂向下思考,自底向上計算。

將數塔傾斜,用i,j表示在數塔中位置,dp[ i ][ j ]則表示在為位置( i , j )時,能夠得到的最大值。

得到 1.遞推公式 dp[ i ][ j ] = max(dp[ i + 1 ][ j ],dp[ i ][ j + 1 ]) + num[ i ][ j ];

2.邊界條件 dp[ n - j + 1][ j ]  = num[ j ] ( j = 1 to n )

//即dp[n][0] = num[0],dp[n - 1][1] = num[1]...

免費餡餅 hdu1176

假設在接下來的一段時間裡,餡餅都掉落在0-10這11個位置。開始時gameboy站在5這個位置,因此在第一秒,他只能接到4,5,6這三個位置中其中乙個位置上的餡餅。問gameboy最多可能接到多少個餡餅?(假設他的揹包可以容納無窮多個餡餅)

輸入資料有多組。每組資料的第一行為以正整數n(0

求表示gameboy最多接到幾個餡餅?

分析:處於乙個位置,每次可以選擇向左,向右,或者不動。

每次的選擇,依然取決於,向左,向右,不動,哪個選擇能使,達到最大值。

當時間在倒數第二秒時,每次選擇,僅取決於,下一秒,3個位置中的哪個位置,會得到最大值。

仍然用i,j表示在這個樹中的位置,i 表示位置(0 ~ 10),j表示時間,dp[ i ][ j ]表示,在時間j,位置i所能得到的最大值。

得到 1.遞推公式 dp[ i ][ j ] = max(dp[ i - 1][ j + 1 ],dp[ i ][ j + 1 ],dp[ i + 1 ][ j + 1 ]) + 在時刻j,位置i所落下的餡餅數

//注意i,j不要越界

2.邊界條件 dp[ i ][ last_time ] = 在last_time最後一刻,位置i落下的餡餅數

#include

#include

#include

#include

#include

using

namespace

std;

const

intmaxt =

100005;

intdp[

12][

maxt];

void

solve(

intlast_time,

map<

int,

vector

<

int>> &mp)

} else

else

if(i == 10)

dp[i][j] =

max(

dp[i][j + 1],

dp[i -

1][j +

1]);

else

dp[i][j] =

max(

dp[i][j +

1],

max(

dp[i +

1][j + 1],

dp[i -

1][j +

1])); }

for(int

k =

0; k < v.

size

(); k ++) }

} }int

main()

solve

(last_time, mp);

printf

("%d\n",dp

[5][0

]); }

return0;

}

動態規劃 免費餡餅

都說天上不會掉餡餅,但有一天gameboy正走在回家的小徑上,忽然天上掉下大把大把的餡餅。說來gameboy的人品實在是太好了,這餡餅別處都不掉,就掉落在他身旁的10公尺範圍內。餡餅如果掉在了地上當然就不能吃了,所以gameboy馬上卸下身上的揹包去接。但由於小徑兩側都不能站人,所以他只能在小徑上接...

動態規劃 免費餡餅

思路 二維動態規劃,用二維陣列sum i j 表示在第i秒時在j位置處所能接到的最大的餡餅數,a i j 表示第i秒時在j位置處所下落的餡餅數,則sum i j 的狀態由sum i 1 j 1 和sum i 1 j 和sum i 1 j 1 決定,即 sum i j max max sum i 1 ...

SDUT 免費餡餅 動態規劃

time limit 1000 ms memory limit 32768 kib submit statistic problem description 都說天上不會掉餡餅,但有一天gameboy正走在回家的小徑上,忽然天上掉下大把大把的餡餅。說來gameboy的人品實在是太好了,這餡餅別處都不...