问题描述:数字三角形问题
7
3 9
8 2 8
4 7 6 7
2 5 4 3 5
在上面的数字三角形中寻找一条从顶部到底部的路径,使得路径上所经过的数字只和最大。
路径上的每一步都只能往左下或右下走。只需要求出这个最大和即可,不必给出具体路径。
输入格式:
4 //三角形行数。下面是三角形
7
3 8
8 1 0
2 7 4 4
题目分析:
对于此题我们首先想到的思路就是通过递归求解,但仔细分析,假如给定的行数n比较大,那么在时间复杂度将达到2^n阶,可想而知,这是非常大的,并且牵扯到重复计算。因此,我们可以使用动态规划的思想来解决问题,通过牺牲空间降低时间复杂度,这里申请一个二维数组存放已计算的值。
具体代码如下:
#include<stdio.h>
#define Max 6
int maxSum[Max][Max]; //存放对应三角形元素到底部的值
int n;
int D[Max][Max];
int max(int x,int y ){
return x>=y?x:y;
}
int main(){
int i,j;
scanf("%d",&n);
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
scanf("%d",&D[i][j]);
for(i=1;i<=n;i++)
maxSum[n][i] = D[n][i];//最后一行到底部的值等于三角形底部行对应的值
for(i=n-1;i>=1;i--)
for(j=1;j<=i;j++)
maxSum[i][j]=max(maxSum[i+1][j],maxSum[i+1][j+1])+D[i][j];//取较大值
printf("%d",maxSum[1][1]);
}
以上程序时间复杂度为O(n^2)
测试如下: