**算法设计与分析---数字三角形问题**

算法设计与分析—数字三角形问题

请编一个程序计算从顶到底的某处的一条路径,使该路径所经过的数字总和最大。只要求输出总和。
  1、 一步可沿左斜线向下或右斜线向下走;
  2、 三角形行数小于等于100;
3、 三角形中的数字为0,1,…,99;
测试数据通过键盘逐行输入,如上例数据应以如下所示格式输入:
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

1.顺推法
定义F[x][y]表示从(1,1)出发到达(x,y)的路径最大权值和。
F[x][y]=?
向左:
F[x-1,y]+A[x,y];
向右:
F[x-1,y-1]+A[x,y];

#include 
 #include 
 using namespace std;
  const int MAXN = 1005;
  int A[MAXN][MAXN],F[MAXN][MAXN],N;
   int main()  {
      cin >> N;
         for(int i = 1;i <= N;i ++)
                for(int j = 1;j <= i;j ++)
                          cin >> A[i][j];
   F[1][1] = A[1][1];
      for(int i = 2;i <= N;i ++)
                       for(int j = 1;j <= i;j ++)
                                       F[i][j]=max(F[i-1][j-1],F[i-1][j])+A[i][j];
   int ans =0;
      for(int i = 1;i <= N;i ++)
             ans = max(ans,F[N][i]);
            cout << ans << endl;
      return 0;
        }

2.逆推法
定义F[x][y]表示从n层出发到达(x,y)的路径最大权值和。
自底向上计算:(给出递推式和终止条件)
①从底层开始,本身数即为最大数;
②倒数第二层的计算,取决于底层的数据:12+6=18,13+14=27,24+15=39,24+8=32;
③倒数第三层的计算,取决于底二层计算的数据:27+12=39,39+7=46,39+26=65
F[i][j]=max(F[i+1][j],F[i+1][j+1])+A[i][j];
递推边界条件: F[n][i]=A[n][i]
**算法设计与分析---数字三角形问题**_第1张图片

#include 
#include 
using namespace std;
const int MAXN = 1005;
int A[MAXN][MAXN],F[MAXN][MAXN],N;
int max(int a,int b){
 if(a>b) return a;
 return b;
}
int main()  {
 int i; cin >> N;
 for( i = 1;i <= N;i ++)
  for(int j = 1;j <= i;j ++)
   cin >> A[i][j];
 for( i = 1;i <= N;i ++)
  F[N][i] = A[N][i];
 for( i = N-1;i >=1;i --)
  for(int j = 1;j <= i;j ++)
   F[i][j]=max(F[i+1][j],F[i+1][j+1])+A[i][j];
 cout << F[1][1] << endl;
 return 0;
  }

你可能感兴趣的:(算法)