• Number Triangles


    JDOJ 1671 

    Number Triangles

    https://neooj.com/oldoj/problem.php?id=1671

    题目描述

    考虑在下面被显示的数字金字塔.
    写一个程序来计算从最高点开始在底部任意处结束的路径经过数字的和的最大.
    每一步可以走到左下方的点也可以到达右下方的点.
    7
    3 8
    8 1 0
    2 7 4 4
    4 5 2 6 5
    在上面的样例中,从7 到 3 到 8 到 7 到 5 的路径产生了最大和:30

    输入

    第一个行包含 R(1<= R<=1000) ,表示行的数目.
    后面每行为这个数字金字塔特定行包含的整数.
    所有的被供应的整数是非负的且不大于100.

    输出

    单独的一行包含那个可能得到的最大的和.

    样例输入

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

    样例输出

    30

    来源

    USACO

    真的是动态规划最经典最基础最裸的一道题了

    这里讲一下动态规划(DP大法)

    动态规划的概念: 多阶段决策过程的优化问题时,具有最优化原理,把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐步求解,这类过程优化解决多阶段决策的方法叫做动态规划。 动态规划的性质: 1.最优化原理(最优子结构性质) 最优化原理可这样阐述:一个最优化策略具有这样的性质,不论过去状态和决策如何,对前面的决策所形成的状态而言,余下的诸决策必须构成最优策略。简而言之,一个最优化策略的子策略总是最优的。 2.无后效性将各阶段按照一定的次序排列好之后,对于某个给定的阶段状态,它以前各阶段的状态无法直接影响它未来的决策,而只能通过当前的这个状态得到当前最优的解。换句话说,过去的步骤只能通过当前的状态来影响未来的发展,每个状态都是过去历史的一个完整总结。这就是无后向性,又称为无后效性。某阶段的状态一旦确定,则此后过程的演变不再受此前各种状态及决策的影响,简单的说,就是“未来与过去无关”,当前的状态是此前历史的一个完整总结,此前的历史只能通过当前的状态去影响过程未来的演变。 适用动态规划的问题必须满足最优化原理和无后效性。

    动态规划的过程: 动态规划相当于把一个问题划分成若干个部分,对于每个部分分别进行计算,然后得到全局最优解。从一个状态经过一个阶段到达另一个状态,就叫做状态转移。而状态转移过程中,我们常常要在很多的可选择途径中找到一个最优的,这个选择的过程就叫做策略。

    4大要素

    状态 初值 转移 answer

    Code:

    #include<bits/stdc++.h>
    using namespace std;
    int a[1100][1100],f[1100][1100],ans;
    int main()
    {
        int r;
        scanf("%d",&r);
        for(int i=1;i<=r;i++)
            for(int j=1;j<=i;j++)
                scanf("%d",&a[i][j]);
        for(int i=1;i<=r;i++)
            for(int j=1;j<=i;j++)
                f[i][j]=max(f[i-1][j],f[i-1][j-1])+a[i][j];
        for(int i=1;i<=r;i++)
            if(f[r][i]>=ans)
                ans=f[r][i];
        cout<<ans;
        return 0;
    }
  • 相关阅读:
    多视点视频的分类和技术标准
    判断任意控制台输入十进制数是否为水仙花数(C++)
    mysql创建新用户并授权限
    Linux下使用sqlplus查询数据时乱行显示问题
    读Strarling有感
    Starling性能优化技巧
    如何在Django Rest Framework中过滤嵌套的序列化器?
    sql 高级教程
    小技巧字符串比较
    WPF MVVM DataGrid数据直更新
  • 原文地址:https://www.cnblogs.com/fusiwei/p/11163324.html
Copyright © 2020-2023  润新知