您的位置:首页 > 其它

新数字三角形问题

2016-05-18 17:00 423 查看

新数字三角形问题

Time Limit: 1000MS Memory limit: 65536K

题目描述

给定一个由n(<=100)行数字组成的数字三角形如下所示。设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大。

7
3 8

8 1 0

2 74 1

4 5 2 6 1

对于给定的由n行数字组成的数字三角形,计算从三角形的顶至底的路径经过的数字和的最大值,并输出这个路径的完整坐标。

输入

多组输入

每组数据第一行输入一个n。

接下来的n行,对于第 i(1 --> n) 行每行有 i 个不超过200的正整数

保证对于这n行数据,每行的数字不会重复,如果在某一行的最大值相同了,优先输出靠近左边(j较小)的坐标。

输出

对于每组数据输入一个最大值,占一行。

接下来的n行,每行两个整数,代表你得到这个最大值所走的路径坐标。

示例输入

5

7

3  8

8 1 0

2 74 1

4 5 2 6 1


示例输出

30

5 2

4 2

3 1

2 1

1 1


提示

相信大家都做过数字三角形,今天我要在此基础上做一个相似的新数字三角形

主要思想和数字三角形相似:

首先也要从上到下存数字的和,这里有一个地方不一样,他要求输出顺序,那咱们就从上至下比较那个大就是谁。。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int a[1002][1002];
int max(int n,int m)
{
return n>m?n:m;
}
int b[1002];
int c[1002];
int main()
{
int n,m,i,j;
while(~scanf("%d",&n))
{
for(i = 1;i <= n; i++)
{
for(j = 1;j <=i ;j++)
{
scanf("%d",&a[i][j]);
}
}
for(i = n;i > 1; i--)
{
for(j = 1;j < i; j++)
{
a[i-1][j] = a[i-1][j]+max(a[i][j],a[i][j+1]);
}
}
b[0] = 1;
c[0] = 1;
j = 1;
int k = 1;
for(i = 2;i <= n; i++)
{
if(a[i][j]>a[i][j+1])
{
b[k] = i;
c[k] = j;
k++;
}
else
{
b[k] = i;
c[k] = j+1;
j = j+1;
k++;
}
}
printf("%d\n",a[1][1]);
for(i = n-1;i >= 0; i--)
{
printf("%d %d\n",b[i],c[i]);
}
}
}

代码菜鸟,如有错误,请多包涵!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: