数字三角形问题
Time Limit: 1000 ms Case Time Limit: 1000 ms Memory Limit: 64 MB
Description
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
(Figure 1)
Figure 1 shows a number triangle. Write a program that calculates the highest sum of numbers passed on a route that starts at the top and ends somewhere on the base. Each step can go either diagonally down to the left or diagonally down to the right.
Input
Your program is to read from standard input. The first line contains one integer N: the number of rows in the triangle. The following N lines describe the data of the triangle. The number of rows in the triangle is > 1 but <= 100. The numbers in the triangle, all integers, are between 0 and 99.
Output
Your program is to write to standard output. The highest sum is written as an integer.
Sample Input
Original | Transformed |
5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5
Sample Output
Original | Transformed |
30
—————————————————————分割线的线—————————————————————
思路:这是一道有决策问题的题目考虑每一个点可以选择加上自己上面的或者左上的点。一路加下来,有一个最大值即为所求。我们把三角形储存之后,更新这个三角形,从上到下一路加下去这样就保存了所有结果。在结果中找到最优解。
代码如下:
#include <stdio.h>
#include <string.h>
#define MAX(x, y) (x > y ? x : y)
int main(){
int n, i, j;
scanf("%d", &n);
int a[n][n];
memset(a, 0, sizeof(a));
for(i = 0; i < n; i++)
for(j = 0; j <= i; j++)
scanf("%d", a[i]+j);
for(i = 1; i < n; i++)
for(j = 0; j <= i; j++){
if(j == 0)
a[i][j] += a[i-1][j];//最左端的点只能有一个选择,加上自己上面的点
else
a[i][j] += MAX(a[i-1][j], a[i-1][j-1]);//每个点需要决策:加上面的那个点还是加左上的那个点。
}
int ans = a[n-1][0];
for(j = 0; j < n; j++)
ans = MAX(ans ,a[n-1][j]);//在三角形的最后一行中找到最大值
printf("%d\n", ans);
return 0;
}