/*
*问题描述:数字三角形问题(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;
}

运行结果:

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