hdu-2084 数塔(动态规划)

Time limit1000 ms

Memory limit32768 kB

在讲述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

题解:从上往下走比较困难,从下往上走还是比较简单的。倒数第二层的更新为自己的数字加上下面的两个分支的大的那个,倒数第二层遍历完之后最后一层就没用了,然后遍历倒数第三层,也是自己的数字加上下面的两个分支的大的那个,以此类推就可以了。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<sstream>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<stack>
using namespace std;
#define PI 3.14159265358979323846264338327950

int dp[102][102],a[102][102];
int main()
{
   int t;
   cin>>t;
   while(t--)
   {
       int n;
       cin>>n;
       memset(dp,0,sizeof(dp));
       for(int i=1;i<=n;i++)
           for(int j=1;j<=i;j++)
               cin>>a[i][j];

           for(int j=1;j<=n;j++)
               dp[n][j]=a[n][j];
       for(int i=n;i>=1;i--)
           for(int j=1;j<=n;j++)
               dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+a[i][j];
       cout<<dp[1][1]<<endl;
   }
}


原文地址:https://www.cnblogs.com/smallhester/p/9499167.html

时间: 2024-07-30 10:09:28

hdu-2084 数塔(动态规划)的相关文章

hdu 2084 数塔(动态规划)

本题是一个经典的动态规划题. 直接利用记忆化搜索:见图解 Ac code : #include<stdio.h> #include<string.h> #define max(i,j) (i>j?i:j) #define maxn 105 int a[maxn][maxn]; int d[maxn][maxn]; int s(int i,int j,int n) { if(d[i][j]>=0)return d[i][j]; return d[i][j]=a[i][j]

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

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 2084 数塔(DP初步应用)

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

hdu 2084 数塔 (简单dp)

http://acm.hdu.edu.cn/showproblem.php?pid=2084 数塔 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 28668    Accepted Submission(s): 17230 Problem Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下

HDU 2084 数塔 简单动态规划

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2084 题目大意:有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少? 题目分析:首先我们可以给数塔中的每一个点制定一个坐标.最上面的9的坐标是(1,1),第二行的12的坐标是(2,1),15的坐标是(2,2),以此类推,第i行的第j个数的坐标就是(i,j).我们假设一共有n行,并且设a[i][j]为坐标为(i,j)对应的数,f[i][j]为从(i,j)

HDU 2084 数塔(简单DP入门)

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

HDU 2084 数塔 (DP)

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

ACM 杭电HDU 2084 数塔 [解题报告]

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

HDU 2084 数塔

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