数字三角形

Posted twomeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数字三角形相关的知识,希望对你有一定的参考价值。

  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 }

 

以上是关于数字三角形的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个 CSS 片段可以画一个三角形? [复制]

JDOJ 1606 数字三角形

数字三角形

求解一道Python编程题(求代码)

片段着色器不会在 OpenGL GLSL 中创建像光一样的渐变

Cg入门16:Fragment shader - 片段级光照