【遞迴】數字三角形DFS記憶化搜尋遞迴
阿新 • • 發佈:2021-01-17
2192: 【遞迴】數字三角形
時間限制: 1 Sec 記憶體限制: 64 MB
題目描述
對於大多數人來說,“我們是這麼的正常,因此也就這麼的平庸。”而天才總是與眾不同的,所以當邪狼問修羅王:“老大,你蹲在那兒一動不動看了有半個小時了,螞蟻有那麼好看嗎?”
修羅王是這樣回答的:“我在思索人生的意義,你看這螞蟻的面前有無數的道路選擇,但它不知道選擇哪條路可以到達目標,也不知道哪條路上有更多的食物,更不知道現在選擇的道路對它以後的影響……”
如圖所示,有一個層數為n(n≤1000)的數字三角形。現有一隻螞蟻從頂層開始向下走,每走下一級時,可向左下方向或右下方向走。求走到底層後它所經過數字的總和的最大值。
輸入
第一個整數為n,以下n行為各層的數字。
輸出
一個整數,即最大值,保證不超過整型的最大範圍。
樣例輸入 Copy
5
1
6 3
8 2 6
2 1 6 5
3 2 4 7 6
樣例輸出 Copy
23
提示
最大值=1+3+6+6+7=23
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
priority_queue <int,vector<int>,less<int> > q;
priority_queue < int,vector<int>,greater<int> > pp;
vector <int> aa;
const int maxn=1e6+888;
const int N=1006;
int n,sum=0,minx=-1;
int a[N][N];
int b[N][N];
int x=0,y=0;
int dfs(int x,int y)
{
if(x==n-1||b[x][y])
return a[x][y];
b[x][y]= 1;
return a[x][y]+=max(dfs(x+1,y),dfs(x+1,y+1));
}
ll pre[maxn],sz[maxn],rk[maxn];
ll c[maxn]={0};
int m,v;
int main(){
cin>>n;
for(int i=0;i<n;i++)
{
for(int j=0;j<=i;j++)
{
cin>>a[i][j];
}
}
cout<<dfs(0,0);
}