zoukankan      html  css  js  c++  java
  • 题解报告:hdu 2084 数塔(递推dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2084

    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[i][j]的值保存该点到第n层的最大数字和。我们要做的就是通过比较dp[i+1][j]与dp[i+1][j+1]这两个谁大就取谁,让其与D[i][j]本身的权值相加即可。这样从下往上推,最后归于顶点。
    状态转移方程为dp[i][j] = max(dp[i+1][j],dp[i+1][j+1])+D[i][j].
    AC代码:
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int main(){
     4     int C,N,dp[105][105],D[105][105];//递推法,递归会超时
     5     cin>>C;
     6     while(C--){//测试实例的个数
     7         cin>>N;//数塔的高度
     8         memset(dp,0,sizeof(dp));//清0
     9         memset(D,0,sizeof(D));
    10         for(int i=0;i<N;i++)
    11             for(int j=0;j<=i;j++)
    12                 cin>>D[i][j];//读入直角三角形数塔
    13         for(int i=N-1;i>=0;i--)//从最低层往上递推
    14             for(int j=0;j<=i;j++)
    15                 dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+D[i][j];//取下一层一个和它的右边一个最大的+当前的值
    16         cout<<dp[0][0]<<endl;//输出最上层即为最大的数字和
    17     }
    18     return 0;
    19 }
  • 相关阅读:
    海量数据处理
    mysql数据导出
    手机归属地
    如何正确合理的建立MYSQL数据库索引
    Java 复杂excel报表导出
    NullpointerException真的一定要被预防?
    代码传递信息方式的探究
    ThreadLoacl的反思
    Codis分布式锁
    spring mvc:事务引起的try/catch失效
  • 原文地址:https://www.cnblogs.com/acgoto/p/8686001.html
Copyright © 2011-2022 走看看