zoukankan      html  css  js  c++  java
  • Problem F

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

    有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?
    Problem <wbr>F
    已经告诉你了,这是个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
    题意:数字三角型,让你求从上往下走经过得数的最大和;
    解题思路:在openjudge上,上个学期就做过了,不过上次刚开始写DP还不大懂,现在明白多了;由下往上每次比较节点的两个儿子加上当前位置数的值哪个大去哪个;
    感悟:有的东向西时间长了,就会加深理解;
    代码:
    #include
    #include
    #define maxn 110
    using namespace std;
    int main()
    {
        //freopen("in.txt", "r", stdin);
        int t,n,cost[maxn][maxn],dp[maxn][maxn];
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d",&n);
            for(int i=1;i<=n;i++)
                for(int j=1;j<=i;j++)
                scanf("%d",&cost[i][j]);
            for(int i=1;i<=n;i++)
                dp[n][i]=cost[n][i];
            for(int i=n-1;i>=1;i--)//从下往上DP
                for(int j=1;j<=i;j++)
                    dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+cost[i][j];
            printf("%d ",dp[1][1]);
        }
        return 0;
    }

  • 相关阅读:
    POJ 2251 Dungeon Master
    HDU 3085 Nightmare Ⅱ
    CodeForces 1060 B Maximum Sum of Digits
    HDU 1166 敌兵布阵(树状数组)
    HDOJ 2050 折线分割平面
    HDU 5879 Cure
    HDU 1878 欧拉回路
    HDU 6225 Little Boxes
    ZOJ 2971 Give Me the Number
    HDU 2680 Choose the best route
  • 原文地址:https://www.cnblogs.com/wuwangchuxin0924/p/5781591.html
Copyright © 2011-2022 走看看