POJ 1163 The Triangle

题目链接:POJ 1163

Description

7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

上图的数字三角形表示一个迷宫,每个数字代表此处的金币数。鹏神从上端顶点出发,要走到底边,每一步都只能向下走,但可以选择向正下方走,或者向右下方一格走。你需要帮助鹏神计算出他最多能得到多少金币。

Input

输入包含多组数据,处理至文件结束。

第一行为一个正整数N:表示数字三角形的行数。(1<N≤100)
接下来N行用来输入数字三角形迷宫每个位置的金币数。其中所有数字大小都在0到99之间。

Output

对于每组输入数据,输出一个数,即鹏神最多所能得到的金币数。

Sample Input

5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

Sample Output

30

Hint

 测试样例中,鹏神的走法为:↓↓↘↓,即:7-3-8-7-5,总和为30。

题意

给出一个金字塔样子的几行数,求一条路径,从顶点出发,每次向下只能走当前的下面和下面右边一格,问走到最底时可以获得的最高分数,也就是经过的数字之和最大。

题解:

DP经典题目,状态转移式也显而易见了,从倒数第二层开始向上,dp[i][j] = max(dp[i + 1][j], dp[i + 1][j + 1]) + dp[i][j],最后输出dp[0][0]。

代码

#define _CRT_SECURE_NO_WARNINGS
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<cstring>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
using namespace std;

typedef long long ll;

const double PI = acos(-1.0);
const double eps = 1e-6;
const int INF = 0x3f3f3f3f;
const int N = 2e5 + 5;
const int maxn = 110;
int dp[maxn][maxn];
int main() {
	int n;
	while (cin >> n) {
		memset(dp, 0, sizeof dp);
		for (int i(0); i < n; i++)
			for (int j(0); j <= i; j++)
				cin >> dp[i][j];
		for (int i(n - 2); i >= 0; i--)
			for (int j(0); j <= i; j++)
				dp[i][j] = max(dp[i + 1][j], dp[i + 1][j + 1]) + dp[i][j];
		cout << dp[0][0] << endl;
	}


	return 0;
}
posted @ 2018-09-06 21:35  Titordong  阅读(123)  评论(0编辑  收藏  举报