题目描述
有如图所示的数塔,从顶部出发,在每一结点可以选择向左走或是向右走,一起走到底层,要求找出一条路径,使路径上的值最大。
输入
第一行: 数塔的层数n(0 < n <= 500)
第二行: t[1, 1]
第三行: t[2, 1] t[2, 2]
...
第n+1行:t[n, 1] t[n, 2]...t[n, n] (用一个空格隔开,-1000 < t[i, j] < 1000)
输出
第一行:'max='最大路径值
样例输入
5 13 11 8 12 7 26 6 14 15 8 12 7 13 24 11
样例输出
max=86
提示
来源
AC代码:
#include<bits/stdc++.h>
using
namespace
std;
const
int
OO=2e9;
const
int
MS=505;
int
t[MS][MS],dp[MS][MS];
int
n;
int
d(
int
i,
int
j){
if
(dp[i][j]!=-OO)
return
t[i][j];
if
(i==n)
return
t[i][j];
int
&ans=dp[i][j];
for
(
int
k=0;k<2;k++)
ans=max(ans,d(i+1,j+k)+t[i][j]);
return
ans;
}
int
main(){
scanf
(
"%d"
,&n);
for
(
int
i=1;i<n+1;i++)
for
(
int
j=1;j<i+1;j++){
scanf
(
"%d"
,&t[i][j]);
dp[i][j]=-OO;
}
for
(
int
i=1;i<n+1;i++)dp[n][i]=t[n][i];
for
(
int
i=n;i>0;i--)
for
(
int
j=1;j<n+1;j++)
for
(
int
k=0;k<2;k++){
int
&ans=dp[i][j];
ans=max(ans,dp[i+1][j+k]+t[i][j]);
}
printf
(
"max=%d"
,dp[1][1]);
return
0;
}