动态规划_数字三角形问题

/*
 *问题描述:数字三角形问题(POJ1163),求最上方数字到最下行所有路径中和最大的和
 /*递归法*/
 /*
 #include <iostream>
 #include <algorithm>
 #define MAX 101
 using namespace std;
 int D[MAX][MAX];//用来存放输入的数据
 int n;
 int MaxSum(int i,int j)//计算D[i][j]到底边的各条路径中,最佳路径的数字之和
 {
     if(i == n)//当只有一层时
     {
         return D[i][j];
     }
     int x = MaxSum(i+1,j);
     int y = MaxSum(i+1,j+1);
     return max(x,y)+D[i][j];
 }
 int main()
 {
     int i,j;
     cin>>n;
     for(i = 1; i<= n ;i++)
        for(j=1 ;j<=i ; j++)
            cin>> D[i][j];
     cout << MaxSum(1,1) <<endl;

     return 0;
 }

/*
 *上述算法会深度遍历每条路径,存在大量的重复计算。
 、则时间复杂度为2的n次方。对于n=100行时,肯定超时
 */
 #include <iostream>
 #include <algorithm>
 #define MAX 101
 using namespace std;
 int D[MAX][MAX];//用来存放输入的数据
 int maxSum[MAX][MAX];//用来存放D[i][j]到底边路径中最佳路径的数字和
 int n;
 int MaxSum(int i,int j)//计算D[i][j]到底边的各条路径中,最佳路径的数字之和
 {
     if(maxSum[i][j]!= -1)
        return maxSum[i][j];
     if(i == n)//当只有一层时
     {
         maxSum[i][j] = D[i][j];
     }
     else
     {
         int x = MaxSum(i+1,j);
        int y = MaxSum(i+1,j+1);
        maxSum[i][j] = max(x,y)+D[i][j];
     }
     return maxSum[i][j];
 }
 int main()
 {
     int i,j;
     cin>>n;
     for(i = 1; i<= n ;i++)
        for(j=1 ;j<=i ; j++)
        {
            cin>> D[i][j];
            maxSum[i][j] = -1;

        }

     cout << MaxSum(1,1) <<endl;

     return 0;
 }

运行结果:


相关推荐
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页