1037 數字三角形(基礎DP)

2021-07-01 21:17:22 字數 3086 閱讀 8674

題目鏈結

#1037 : 數字三角形

時間限制:10000ms

單點時限:1000ms

記憶體限制:256mb

問題描述

小hi和小ho在經歷了螃蟹先生的任務之後被獎勵了一次出國旅遊的機會,於是他們來到了大洋彼岸的美國。美國人民的生活非常有意思,經常會有形形色色、奇奇怪怪的活動舉辦,這不,小hi和小ho剛剛下飛機,就趕上了當地的迷宮節活動。迷宮節裡展覽出來的迷宮都特別的有意思,但是小ho卻相中了乙個其實並不怎麼像迷宮的迷宮——因為這個迷宮的獎勵非常豐富~

於是小ho找到了小hi,讓小hi幫助他獲取盡可能多的獎品,小hi把手一伸道:「迷宮的介紹拿來!」

小ho選擇的迷宮是乙個被稱為「數字三角形」的n(n不超過200)層迷宮,這個迷宮的第i層有i個房間,分別編號為1..i。除去最後一層的房間,每乙個房間都會有一些通往下一層的房間的樓梯,用符號來表示的話,就是從第i層的編號為j的房間出發會有兩條路,一條通向第i+1層的編號為j的房間,另一條會通向第i+1層的編號為j+1的房間,而最後一層的所有房間都只有一條離開迷宮的道路。這樣的道路都是單向的,也就是說當沿著這些道路前往下一層的房間或者離開迷宮之後,小ho沒有辦法再次回到這個房間。迷宮裡同時只會有乙個參與者,而在每個參與者進入這個迷宮的時候,每個房間裡都會生成一定數量的獎券,這些獎券可以在通過迷宮之後兌換各種獎品。小ho的起點在第1層的編號為1的房間,現在小ho悄悄向其他參與者弄清楚了每個房間裡的獎券數量,希望小hi幫他計算出他最多能獲得多少獎券。

提示一:盲目貪心不可取,搜尋計算太耗時

提示二:記憶深搜逞神威,寬度優先解難題

提示三:總結歸納提公式,減少冗餘是真理

輸入每個測試點(輸入檔案)有且僅有一組測試資料。

每組測試資料的第一行為乙個正整數n,表示這個迷宮的層數。

接下來的n行描述這個迷宮中每個房間的獎券數,其中第i行的第j個數代表著迷宮第i層的編號為j的房間中的獎券數量。

測試資料保證,有100%的資料滿足n不超過100

對於100%的資料,迷宮的層數n不超過100

對於100%的資料,每個房間中的獎券數不超過1000

對於50%的資料,迷宮的層數不超過15(小ho表示2^15才3萬多呢,也就是說……)

對於10%的資料,迷宮的層數不超過1(小hi很好奇你的邊界情況處理的如何?~)

對於10%的資料,迷宮的構造滿足:對於90%以上的結點,左邊道路通向的房間中的獎券數比右邊道路通向的房間中的獎券數要多。

對於10%的資料,迷宮的構造滿足:對於90%以上的結點,左邊道路通向的房間中的獎券數比右邊道路通向的房間中的獎券數要少。

輸出對於每組測試資料,輸出乙個整數ans,表示小ho可以獲得的最多獎券數。

樣例輸入52

6 41 2 8

4 0 9 6

6 5 5 3 6

樣例輸出

28正向的計算,

#include#include#include#include#include//#includeusing namespace std;

templateinline t read(t&x)

templateinline t read_(t&x,t&y)

templateinline t read__(t&x,t&y,t&z)

templateinline void write(t x)

templateinline void writeln(t x)

//-------zcc io template------

const int maxn=211;

const double inf=999999999;

#define lson (rt<<1),l,m

#define rson (rt<<1|1),m+1,r

#define m ((l+r)>>1)

#define for(i,t,n) for(int i=(t);i<=(n);i++)

typedef long long ll;

typedef double db;

typedef pairp;

#define bug printf("---\n");

#define mod 1000000007

int rewards[maxn][maxn];

int best[maxn][maxn];

int main()

int ans=0;

for(i=1;i<=n;i++)ans=max(ans,best[n][i]);

printf("%d\n",ans);

}return 0;

}

//逆向的計算

#include#include#include#include#include//#includeusing namespace std;

templateinline t read(t&x)

templateinline t read_(t&x,t&y)

templateinline t read__(t&x,t&y,t&z)

templateinline void write(t x)

templateinline void writeln(t x)

//-------zcc io template------

const int maxn=211;

const double inf=999999999;

#define lson (rt<<1),l,m

#define rson (rt<<1|1),m+1,r

#define m ((l+r)>>1)

#define for(i,t,n) for(int i=(t);i<=(n);i++)

typedef long long ll;

typedef double db;

typedef pairp;

#define bug printf("---\n");

#define mod 1000000007

int rewards[maxn][maxn];

int best[maxn][maxn];

int main()

return 0;

}

數字三角形 DP

數字三角形 時間限制 10000ms 單點時限 1000ms 記憶體限制 256mb 問題描述 小hi和小ho在經歷了螃蟹先生的任務之後被獎勵了一次出國旅遊的機會,於是他們來到了大洋彼岸的美國。美國人民的生活非常有意思,經常會有形形色色 奇奇怪怪的活動舉辦,這不,小hi和小ho剛剛下飛機,就趕上了當...

(dp)數字三角形

數字三角形問題。有乙個由非負整數組成的三角形,第一行只有乙個數,除了最下行 之外每個數的左下方和右下方各有乙個數 從第一行的數開始,每次可以往左下或右下走一格,直到走到最下行,把沿途經過的數 全部加起來。如何走才能使得這個和盡量大?具體實現 中的d我們用maxsum表示 最初的位置我們用d存 1.把...

數字三角形 dp

給定乙個如下圖所示的數字三角形,從頂部出發,在每一結點可以選擇移動至其左下方的結點或移動至其右下方的結點,一直走到底層,要求找出一條路徑,使路徑上的數字的和最大。73 8 8 1 0 2 7 4 4 4 5 2 6 5 輸入格式 第一行包含整數n,表示數字三角形的層數。接下來n行,每行包含若干整數,...