DP 1 數塔問題

2022-08-31 01:30:14 字數 1785 閱讀 5137

數塔問題

基本模型

如上圖所示數塔, 要求從頂層走到底層,若每一步只能走到相鄰的結點,則經過的結點的數字之和最大是多少?

數塔思想: 自頂向下分析, 自底向上計算。

h(i) 表示第i層的最大值。要得到h(i + 1), 則考慮上一層結點, 到其相鄰節點可取得的值, 取最大值作為h(i + 1)。

如果按照上述做法, 從頂到底算起, 則時間複雜度為 o(2^(n – 1));

考慮從底部算起,計算每個結點到底層的最大值,即上一層結點與其相鄰節點的最大值,以這個最大值作為上一層結點的值, 重複這一過程,直到塔頂。時間複雜度為o(n)

簡單應用多少條路徑

猴子爬樹, 最初猴子在第一棵樹上, 每過一分鐘, 猴子會跳到相鄰的樹上。現在這裡有n棵樹, 求過了m分鐘,有多少種不同的跳法跳到第t棵樹。(hdu2151)

考慮以下圖形, 是不是很像乙個數塔?

多頂點型數塔(hdu 1176)

免費餡餅, 有0—10個位置, 起始時, 人在5處, 每一秒都會有幾個餡餅落下來, 每秒人可以移動到相鄰的位置, 問最多可以接多少個餡餅?

考慮如下演算法:

dp[i][j] 表示從第i秒起第j個位置可得到的餡餅;

pie[i][j] 表示第i秒第j個位置落下的餡餅

從最後一秒算起,

dp[i][j] = max(dp[i + 1][j], max(dp[i + 1][j - 1],  dp[i + 1][j + 1]))+ pie[i][j]

重複這一過程知道t = 0; 最後這會形成乙個多頂點的數塔, 每個位置都是乙個頂點。

例題源**

hdu 2084

#include int tower[100][100];

int main()

} for (i = n - 1; i >= 1; i --) // 自底向上計算每一層的最大值

}} printf ("%d\n", tower[1][1]);

} return 0;

}

hdu 2151

#include #include int main()

times[k ^ 1][tree[k][i] - 1] += times[k][tree[k][i]];

}if (tree[k][i] < n)

times[k ^ 1][tree[k][i] + 1] += times[k][tree[k][i]];

}times[k][tree[k][i]] = 0;

}numbers = j;

k ++;

} printf ("%d\n", times[k % 2][t]);

} return 0;

}

hdu 1176

#include #include #define max 100002

int pie[max][13];

int dp[max][13];

int max_v (int a, int b);

int main()

pie[t][x + 1] ++;

} for (i = max_t; i >= 0; i --)

}printf ("%d\n", dp[0][6]);

} return 0;

}int max_v (int a, int b)

return b;

}

dp 1 跳台階問題

問題 共n層台階,每次只能上1級或者2級,問有多少種上台階的方法。首先分析一下題目,一般這種問題我都會先找一下規模最小的數值來分析一下,可以看到,上一層的走法是1種 1 上2層的走法是2種 11,2 三層有3種 12,21,111 四層有5種 1111,22,211,121,112 偷偷發現好像是斐...

DP數塔問題

有如下所示的數塔,要求從頂層走到底層,若每一步只能走到相鄰的結點,則經過的結點的數字之和最大是多少?有一組測試樣例,測試例項的第一行是乙個整數n 1 n 100 表示數塔的高度,接下來用n行數字表示數塔,其中第i行有個i個整數,且所有的整數均在區間 0,99 內。output 對於每個測試例項,輸出...

dp1 乘積最大

一 心得 1 用excel填陣列很方便 2 dp就是填表 找狀態就是縮小規模 找狀態轉移方程就是 找狀態的最後一次關係 二 題目 總時間限制 1000ms 記憶體限制 65536kb 描述今年是國際數學聯盟確定的 2000 世界數學年 又恰逢我國著名數學家華羅庚先生誕辰90周年。在華羅庚先生的家鄉江...