AOJ-AHU-OJ-64 数字三角形

69 篇文章 0 订阅
9 篇文章 0 订阅
数字三角形问题
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
OriginalTransformed
5
7
3 8
8 1 0 
2 7 4 4
4 5 2 6 5

Sample Output
OriginalTransformed
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;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值