用二维数组存放数组三角形;
D(r, j):第r行第j个数字(r,jcing1开始算)
MaxSum(r,j):从D(r, j)到底边的各条路径中,最佳路径的数字之和。
所以问题化成求MaxSum(1,1):
D(r,j)出发,下一步只能走D(r+1, j)或者D(r, j+1)
if(r ==N)
MaxSum(r,j)= D(r, j);
else
MaxSum(r,j) = Max{MaxSum(r + 1, j), MaxSum(r+1, j+1)} + D(r, j);
每算出来一个MaxSum(r, j)就保存起来,下次用到其值的时候直接取用,则可免去重复计算。
那么可以用O(n的平方)时间计算完成。
#define max 101
int d[max][max];
int n;
int maxsum[max][max];
int maxSum(int i,int 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()
{
cin >> n;
int i,j;
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;
}