数字三角形问题:
7
3 8
8 1 0
2 7 7 4
5 5 2 6 5
示出了一个数字三角形宝塔。数字三角形中的数字为不超过100的正整数。现规定从最顶层走到最底层,每一步可沿左斜线向下或右斜线向下走。假设三角形行数≤100,编程求解从最顶层走到最底层的一条路径,使得沿着该路径所经过的数字的总和最大,输出最大值。输人数据:由文件输入数据,文件第一行是三角形的行数N。以后的N行分别是从最顶层到最底层的每一层中的数字。
如输入: 5
7
3 8
8 1 0
2 7 7 4
4 5 2 6 5
输出:30
【分析】对于这一问题,很容易想到用枚举的方法(深度搜索法)去解决,即列举出所有路径并记录每一条路径所经过的数字总和,然后寻找最大的数字总和


1
#include<stdio.h>
2
#include<stdlib.h>
3
#include<iostream>
4
using namespace std;
5
#define MAX 100
6
int a[MAX][MAX];
7
int f[MAX][MAX];
8
int map[MAX][MAX];
9
int main()
10

{
11
int i,j,n,min;
12
while(scanf("%d",&n)!=EOF)
13
{
14
int c,b=n;
15
/**//*以下为输入方式*/
16
for(i=1;i<=n;i++)
17
{
18
for(j=1;j<=i;j++)
19
{
20
scanf("%d",&a[i][j]);
21
f[i][j]=a[i][j];
22
}
23
}
24
//初始化f[1][1];
25
f[1][1]=a[1][1];
26
//为表图做标记;
27
for(i=2;i<=n;i++)
28
{
29
30
f[i][1]=f[i-1][1]+a[i][1];
31
map[i][0]=0;
32
f[i][i]=f[i-1][i-1]+a[i][i];
33
map[i][i]=1;
34
}
35
/**//*动态规划选出最优解
36
状态方程组:f[i][j]=min(f[i-1][j]+a[i][j],f[i-1][j-1],a[i][j])
37
*/
38
for(i=3;i<=n;i++)
39
{
40
for(j=2;j<=i-1;j++)
41
{
42
f[i][j]=f[i-1][j-1]+a[i][j];
43
map[i][j]=1;
44
if(f[i][j]>(f[i-1][j]+a[i][j]))
45
{
46
f[i][j]=f[i-1][j]+a[i][j];
47
map[i][j]=0;
48
49
}
50
}
51
}
52
//选出最优解
53
min=f[n][n];
54
for(i=1;i<n;i++)
55
{
56
if(f[n][i]<min)
57
{
58
min=f[n][i];
59
c=n;
60
b=i;
61
}
62
63
}
64
//以下为输出
65
printf("%d\n",min);
66
for(i=1;i<=n;i++)
67
{
68
for(j=1;j<=i;j++)
69
{
70
if(map[i][j]==0)
71
printf("| ");
72
else if(map[i][j]==1)
73
printf("\\ ");
74
else
75
{
76
printf(" ");
77
}
78
}
79
printf("\n");
80
}
81
//倒序输出所有选中项a[i][j]
82
printf("倒序输出所选中的a[i][j]有:");
83
while(c!=1||b!=1)
84
{
85
printf("%d ",a[c][b]);
86
if(map[c][b]==0)
87
{
88
c=c-1;
89
}
90
else if(map[c][b]==1)
91
{
92
c=c-1;
93
b=b-1;
94
}
95
}
96
printf("%d\n",a[1][1]);
97
98
}
99
return 0;
100
}
posted on 2013-04-10 19:28
天YU地___PS,代码人生 阅读(265)
评论(0) 编辑 收藏 所属分类:
acm