数字三角形

  1 #include <iostream>
  2 #include <stdlib.h>
  3 using namespace std;
  4 #define MAX 100
  5 // 数字三角形问题 方法一:递归求解
  6 // execution time 13.681s
  7 /*
  8 解题思路:
  9 1. 用二维数组存放数字三角形
 10 2. d[i][j]:第i行第j个数字
 11 3. maxSum(i,j):从d[i][j]到底边的各条路径中,最佳路径的数字之和
 12 4. 对d[i][j]来说有两条可走路径:
 13     (1)d[i+1][j]
 14     (2)d[i+1][j+1]
 15 5. 递归条件
 16     (1)如果i==num,maxSum(i,j)=d[i][j]
 17     (2)否则,maxSum(i,j)=max{ maxSum(i+1,j),maxSum(i+1,j+1) } + d[i][j]
 18 */
 19 int d[MAX][MAX];
 20 int num;
 21 int maxSum(int i, int j){
 22     if(i == num)
 23         return d[i][j];
 24     int x = maxSum(i+1, j);
 25     int y = maxSum(i+1, j+1);
 26     return max(x,y) + d[i][j];
 27 }
 28 
 29 int main()
 30 {
 31     int i,j;
 32     cin >> num; //输入数字三角形的行数
 33     for(i = 1; i <= num; i ++)
 34         for(j = 1; j <= i; j ++)
 35             cin >> d[i][j];
 36     // 输入三角形矩阵,注意从(1,1)开始
 37     cout << maxSum(1,1) << endl;
 38     // maxSum(i,j)代表从d[i,j]向下的路径中最大的和
 39     return 0;
 40 }
 41 #include <iostream>
 42 #include <stdlib.h>
 43 #include <string.h>
 44 #define MAX 100
 45 using namespace std;
 46 // 数字三角形问题 方法二:记忆递归动态规划求解
 47 // execution time 15.280s
 48 int d[MAX][MAX];
 49 int D[MAX][MAX]; //记忆矩阵
 50 int num;
 51 
 52 int maxSum(int i, int j){
 53     if (D[i][j]!=-1)
 54     return D[i][j];
 55     if(i == num)
 56         D[i][j]=d[i][j];
 57     else
 58     {
 59     int x = maxSum(i+1, j);
 60     int y = maxSum(i+1, j+1);
 61     D[i][j]=max(x,y)+d[i][j];
 62     }
 63 
 64     return D[i][j];
 65 }
 66 
 67 int main()
 68 {
 69     int i,j;
 70     cin >> num; //输入数字三角形的行数
 71     for(i = 1; i <= num; i ++)
 72         for(j = 1; j <= i; j ++)
 73             cin >> d[i][j];
 74     // 输入三角形矩阵,注意从(1,1)开始
 75     memset(D,-1,sizeof(D));
 76     /*
 77     功能:
 78     将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值,
 79     块的大小由第三个参数指定,
 80     这个函数通常为新申请的内存做初始化工作。
 81     用法:void *memset(void *s, char ch, unsigned n);
 82     */
 83     cout << maxSum(1,1) << endl;
 84     // maxSum(i,j)代表从d[i,j]向下的路径中最大的和
 85     return 0;
 86 }
 87 
 88 #include <iostream>
 89 #include <stdlib.h>
 90 #include <string.h>
 91 #define MAX 100
 92 using namespace std;
 93 // 数字三角形问题 方法三:递推型动态规划求解
 94 // execution time 18.216s
 95 /*
 96 解题思路:
 97 从底向上递推,出最后一行外,每一行的每个点的最大值等于自身加上下面一行对应左右两个点的最大值。
 98 从下往上递推,最顶部的即所求。
 99 */
100 int d[MAX][MAX];
101 int num;
102 
103 int maxSum(int num){
104     int i, j;
105     for(i = num - 1; i >= 1; i --)
106         for(j = 1; j <= i; j ++){
107             d[i][j] = max(d[i+1][j],d[i+1][j+1]) + d[i][j];
108         }
109     return d[1][1];
110 }
111 
112 int main()
113 {
114     int i,j;
115     cin >> num; //输入数字三角形的行数
116     for(i = 1; i <= num; i ++)
117         for(j = 1; j <= i; j ++)
118             cin >> d[i][j];
119     // 输入三角形矩阵,注意从(1,1)开始
120     cout << maxSum(num) << endl;
121     return 0;
122 }
原文地址:https://www.cnblogs.com/twomeng/p/9509378.html