问题 A(2686): 数字三角形II
时间限制: 1 Sec 内存限制: 128 MB题目描述
输入
第1行:1个整数N,表示数字三角形的行数和列数(1 <= N <= 1000)
接下来N行,第i行有i个整数,表示数字三角形
输出
第1行:1个整数,表示问题的最优解
样例输入
5
1
3 6
9 9 1
5 5 2 3
2 9 7 6 1
样例输出
30
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int O=1005;
int a[O][O],b[O][O],c[O][O],n,ans,Max1,Max2;
int main()
{
int i,j;
scanf("%d",&n);
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
scanf("%d",&a[i][j]);
/*****自顶向下求解路径最大值**********/
b[1][1]=a[1][1];
for(i=2;i<=n;i++)
{
b[i][1]=b[i-1][1]+a[i][1];//最左边的竖线
b[i][i]=b[i-1][i-1]+a[i][i]; //最右边的斜线
}
for(i=2;i<=n;i++)
for(j=2;j<=i-1;j++)
b[i][j]=max(b[i-1][j],b[i-1][j-1])+a[i][j];
/*****自底向上求解路径最大值**********/
for(j=1;j<=n;j++)
c[n][j]=a[n][j];
for(i=n-1;i>=1;i--)
for(j=1;j<=i;j++)
c[i][j]=max(c[i+1][j],c[i+1][j+1])+a[i][j];
ans=c[1][1];
for(i=2;i<n;i++)
{
Max1=*max_element(b[i]+1,b[i]+i+1);
Max2=*max_element(c[i+1]+1,c[i+1]+i+2);
ans=max(ans,Max1+Max2);
}
printf("%d",ans);
return 0;
}