数字三角形II

来源:互联网 发布:建立客户档案软件 编辑:程序博客网 时间:2024/06/06 06:44

问题 A(2686): 数字三角形II

时间限制: 1 Sec  内存限制: 128 MB

题目描述

 

输入

 第1行:1个整数N,表示数字三角形的行数和列数(1 <= N <= 1000)

接下来N行,第i行有i个整数,表示数字三角形

输出

 第1行:1个整数,表示问题的最优解

样例输入

513 69 9 15 5 2 32 9 7 6 1

样例输出

30


这道题和数字三角形I略有相似,点我查看数字三角形I。

—————————————————分析——————————————————

这道题和数字三角形I的唯一不同就是这道题可以在某一行跳到下一行的随机位置。

那么问题来了,怎样确定在哪一行跳呢,或者是不跳呢?

我们可以这样想,如果这一个数它上面的数列和最大,而下面的数列和也最大,那么这个数就是目标数。

所以,直接上代码……

———————————————代码实现——————————————————

#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;
}


戳我查看更多博客


原创粉丝点击