The Triangle POJ - 1163 DP入门

题目描述

在上面的数字三角形中寻找一条从顶部到底边的路径,使得 路径上所经过的数字之和最大。路径上的每一步都只能往左下或 右下走。只需要求出这个最大和即可,不必给出具体路径。                          三角形的行数大于1小于等于100,数字为 0 - 99 

人人为我型递推:D[i][j]=max(D[i+1][j],D[i+1][j+1])+D[I][J] 从最下面一行开始往上更新 更新到第一位

 可以用滚动数组节省空间

 没必要用二维maxSum数组存储每一个MaxSum(r,j),只要从底层一行行向上 递推,那么只要一维数组maxSum[100]即可,即只要存储一行的MaxSum值就 可以。 

code:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
#pragma warning(disable:4996)

using namespace std;
typedef long long ll;
#define MAX 101
int D[MAX][MAX];
int n;
int *maxsum;
int main()
{
	scanf("%d",&n);
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= i; j++)
			scanf("%d",&D[i][j]);
	}
	maxsum = D[n];//maxsum指向第N行
	for (int i = n - 1; i >= 1; i--)
		for (int j = 1; j <= i; j++)//滚动数组 要控制界限滚动数组每一列对应的是最下面的那一列 和旁边的那一列
			maxsum[j] = max(maxsum[j], maxsum[j + 1]) + D[i][j];
	printf("%d\n",maxsum[1]);
	system("pause");
}

猜你喜欢

转载自blog.csdn.net/qq_17175221/article/details/81486499