例题:数字三角形 (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++;
}
}
}