数字三角形!

 

例题:数字三角形 (ai2760)
问题描述
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路
径,把路径上面的数加起来可以得到一个和,和最大的路径称为最佳路径。你的任务就是求
出最佳路径上的数字之和。
注意:路径上的每一步只能从一个数走到下一层上和它最近的左边的数或者右边的数。
输入数据
输入的第一行是一个整数N (1 < N <= 100),给出三角形的行数。下面的N 行给出数字
三角形。数字三角形上的数的范围都在0 和100 之间。
输出要求
输出最大的和。
输入样例
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
输出样例
30

 

 

我的解法:

#include "stdio.h"
#define  N 5


int lastsum=0;
int a[N+1][N+1];

void fun(int i,int j,int sum)
{
 if (i==N)
 {
  sum+=a[i][j];
  if (lastsum<sum)
  {
   lastsum=sum;
  }
  
  return;
 }
 sum+=a[i][j];
 fun(i+1,j,sum);
 fun(i+1,j+1,sum);
}


void main()
{
int i=1,j=1;//i表示层数,j表示列数,都是从1开始
for (i=1;i<=N;i++)
 for(j=1;j<=i;j++)
  scanf("%d",&a[i][j]);
fun(1,1,0);
printf("%d",lastsum);
}

 

书上的解法!

1. #include <stdio.h>
2. #define MAX_NUM 100
3. int D[MAX_NUM + 10][MAX_NUM + 10];
4. int N;
5. int MaxSum( int r, int j)
6. {
7. if( r == N )
8. return D[r][j];
9. int nSum1 = MaxSum(r+1, j);
10. int nSum2 = MaxSum(r+1, j+1);
11. if( nSum1 > nSum2 )
12. return nSum1+D[r][j];
13. return nSum2+D[r][j];
14.
15. }
16. main()
17. {
18. int m;
19. scanf("%d", &N);
20. for( int i = 1; i <= N; i ++ )
21. for( int j = 1; j <= i; j ++ )
22. scanf("%d", &D[i][j]);
23. printf("%d", MaxSum(1, 1));
24. }

 

《程序设计导引即在线实现》问了一个问题:

思考题 10.1:上面的几个程序只算出了最佳路径的数字之和。如果要求输出最佳路径
上的每个数字,该怎么办?

 

我的思路是,动态规划后,数组max里存的是每个点的最大路径值,所以,只要从根节点开始,max[1][1],判断max[1+1][1]与max[1+1][1+1]的大小,然后打印对应的该a[][],

我的程序:

void showmax()
{
 int i,j;
 for (i=1,j=1;i<=N;)
 {
 
   if (max[i+1][j]>max[i+1][j+1])
   {
    printf("%d",a[i+1][j]);
    i++;
   }
   else
   {
    printf("%d",a[i+1][j+1]);
    i++;
    j++;
   }
 
 }
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值