新数字三角形问题
Time Limit: 1000MS Memory limit: 65536K
题目描述
给定一个由n(<=100)行数字组成的数字三角形如下所示。设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大。
7
7
3 8
8 1 0
2 7 4 1
4 5 2 6 1
对于给定的由n行数字组成的数字三角形,计算从三角形的顶至底的路径经过的数字和的最大值,并输出这个路径的完整坐标。输入
多组输入
每组数据第一行输入一个n。
接下来的n行,对于第 i(1 --> n) 行每行有 i 个不超过200的正整数
保证对于这n行数据,每行的数字不会重复,如果在某一行的最大值相同了,优先输出靠近左边(j较小)的坐标。
每组数据第一行输入一个n。
接下来的n行,对于第 i(1 --> n) 行每行有 i 个不超过200的正整数
保证对于这n行数据,每行的数字不会重复,如果在某一行的最大值相同了,优先输出靠近左边(j较小)的坐标。
输出
对于每组数据输入一个最大值,占一行。
接下来的n行,每行两个整数,代表你得到这个最大值所走的路径坐标。
接下来的n行,每行两个整数,代表你得到这个最大值所走的路径坐标。
示例输入
5
7
3 8
8 1 0
2 7 4 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]);
- }
- }
- }
代码菜鸟,如有错误,请多包涵!!