由數塔引出。
數塔:
處於乙個端點,每次可以選擇向左或向右。
而每次選擇,取決於,向左能夠得到最大值,還是向右能得到最大值。
當到達數塔倒數第二行時,向左還是向右,僅僅取決於,向左的端點數值大還是向右的大。
自頂向下思考,自底向上計算。
將數塔傾斜,用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的人品實在是太好了,這餡餅別處都不...