数字三角形问题:
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>
4using namespace std;
5#define MAX 100
6int a[MAX][MAX];
7int f[MAX][MAX];
8int map[MAX][MAX];
9int 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 }
99return 0;
100}
posted on 2013-04-10 19:28
天YU地___PS,代码人生 阅读(264)
评论(0) 编辑 收藏 所属分类:
acm