hdu 2085 数塔 -- dp模板题

数塔

Problem Description

在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的:

有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?

已经告诉你了,这是个DP的题目,你能AC吗?

Input

输入数据首先包括一个整数C,表示测试实例的个数,每个测试实例的第一行是一个整数N(1 <= N <= 100),表示数塔的高度,接下来用N行数字表示数塔,其中第i行有个i个整数,且所有的整数均在区间[0,99]内。

Output

对于每个测试实例,输出可能得到的最大和,每个实例的输出占一行。

Sample Input

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

Sample Output

30
/**
*  dp 模板题
*  dp两个要素:
*  (1)最优子结构性质
*  (2)子问题重叠性质
*  递归关系:  dp[x][y]=max(dp[x-1][y-1],dp[x-1][y])+a[x][y];  表示从顶层到达x层的第y个元素的数字和
*/
#include <stdio.h>
#include <string.h>
#include <limits.h>
#define maxn 105
int max(int a, int b){
	if (a > b) return a;
	return b;
}
int main()
{
	int t;
	scanf("%d", &t);
	while (t--)
	{
		int dp[maxn][maxn], a[maxn][maxn];
		int n;
		scanf("%d", &n);
		for (int k = 1; k <= n; k++)
		for (int i = 1; i <= k; i++)
			scanf("%d", &a[k][i]);
		memset(dp, 0, sizeof(dp));
		dp[1][1] = a[1][1];
		for (int x = 2; x <= n; x++)
		for (int y = 1; y <= x; y++){
			if (1 == y){ dp[x][y] = dp[x - 1][y] + a[x][y]; continue; }
			if (x == y){ dp[x][y] = dp[x - 1][y - 1] + a[x][y]; continue; }
			dp[x][y] = max(dp[x - 1][y - 1], dp[x - 1][y]) + a[x][y];
		}
		int ans = -1;
		for (int i = 1; i <= n; i++){
			if (ans < dp[n][i])
				ans = dp[n][i];
		}
		printf("%d\n", ans);
	}
	return 0;
}

hdu 2085 数塔 -- dp模板题

时间: 2024-08-27 01:38:43

hdu 2085 数塔 -- dp模板题的相关文章

HDU 2048 数塔(DP)

数塔 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 20786    Accepted Submission(s): 12486 Problem Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少

hdu 2084 数塔 dp 动态规划

开始动态规划的学习了,先是比较基础的,很金典的数塔.附上题目链接  http://acm.hdu.edu.cn/showproblem.php?pid=2084 这题的状态转移方程是  dp[i][j] = max(dp[i-1][j-1],dp[i-1][j]) + m[i][j]; (dp[i][j] 表示在第 i 层 第 j 列时的最大和) . 然后一个双重循环,边能算出.当然可以用滚动数组.但是注意用滚动数组解题时,第二层循环 j 必须从大到小, 因为 状态转移方程 为  f  [ j

HDU 2084 数塔 (DP)

数塔 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 2084 Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少? 已经告诉你了,这是个DP的题目,你能AC吗? Input 输入数据首先包括一个整数

简单的dp hdu 数塔(水题)

数塔 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 21314    Accepted Submission(s): 12808 Problem Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少

HDU 2084 数塔 --- 入门DP

HDU 2084 数塔 从下往上递推,状态转移方程 dp[i][j] = max( dp[i+1][j], dp[i+1][j+1]) + a[i][j]; /* HDU 2084 数塔 --- 入门DP */ #include <cstdio> const int N = 105; int dp[N][N]; int MAX(int a, int b){ return a > b ? a : b; } int main() { #ifdef _LOCAL freopen("D

hdu 5092 Seam Carving (简单数塔DP,题没读懂,,不过可以分析样例)

题意: 给一个m*n的矩阵,每格上有一个数. 找从第1行到第m行的一条路径,使得这条路径上的数之和最小. 路径必须满足相邻两行所选的两个数的纵坐标相邻(即一个格子必须是另一个格子的周围八个格子中的一个) 输出每一行取的数的列值.  若有多个答案,则路径要求尽量靠右. 思路: 简单数塔DP.题比较不好读,不过可以分析样例. 代码: int T,m,n; int a[105][105], f[105][105]; int path[105]; int main(){ cin>>T; rep(t,1

HDU 2084 数塔(DP初步应用)

HDU  2084  数塔 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少? 已经告诉你了,这是个DP的题目,你能AC吗? Input 输入数据首先包括一个整数C,表示测试实例的个数,每个测试实例的第一行是一个整数N(1 <= N <= 100),表示数塔的高度,接下来用N行数字表示数塔,其中第i行有个i个整数,且所有的整数均在区间[0,99]内. Output 对于每个测试

HDU 4085 斯坦纳树模板题

Dig The Wells Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 971    Accepted Submission(s): 416 Problem Description You may all know the famous story "Three monks". Recently they find som

poj 1739 Tony&#39;s Tour 插头dp模板题

题意: 给一个迷宫,求左下角到右下角的路径数. 分析: 插头dp的模板题,建议先看cdq的论文再看代码,这份代码在模板基础上略微有改动.论文地址http://wenku.baidu.com/view/ed2b3e23482fb4daa58d4b74.html 代码: #include <iostream> using namespace std; const int maxD=16; const int HASH=10007; const int STATE=1000024; int N,M;