动态规划--数字三角形

问题描述:数字三角形问题

                       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)

测试如下:


 

猜你喜欢

转载自blog.csdn.net/zuiqingxuan/article/details/80040120