• USACO Section 1.5 Number Triangles 解题报告


    题目

    题目描述

    现在有一个数字三角形,第一行有一个数字,第二行有两个数字,以此类推...,现在从第一行开始累加,每次在一个节点累加完之后,下一个节点必须是它的左下方的那个节点或者是右下方那个节点,一直累加到最后一层。问最大的累加和是多少?
    在输入的时候因为格式的问题,所以我们会形成一个直角三角形。那么每个节点的下一个节点只能是它的正下方或者是右下方的那个节点。每个节点的值最大为100。

    输入格式

    第一行是输入这个三角形总共有多少行R(1<=R<=1000),下面输入这个数字三角形。

    输出格式

    直接输出最大的累加和。

    输入样例

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

    输出样例

    30
    

    解题思路

    很经典也很简单的动态规划思想,从最底层开始往上走,每个节点要么是从它的正下方到达,或者是从右下方那个节点到达的。那么我们就在两者之间取最大值即可。

    解题代码

    /*
    ID: yinzong2
    PROG: numtri
    LANG: C++11
    */
    #define MARK
    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    int n;
    int nums[1010][1010], dp[1010][1010];
    
    int main() {
    #ifdef MARK
        freopen("numtri.in", "r", stdin);
        freopen("numtri.out", "w", stdout);
    #endif // MARK
        while (cin >> n) {
            for (int i = 1; i <= n; ++i) {
                for (int j = 1; j <= i; ++j) {
                    cin >> nums[i][j];
                    dp[i][j] = 0;
                }
            }
            // 初始化
            for (int i = 1; i <= n; ++i) {
                dp[n][i] = nums[n][i];
            }
            // 从倒数第二层开始往上走
            for (int i = n-1; i >= 1; --i) {
                for (int j = 1; j <= i; ++j) {
                    dp[i][j] = max(dp[i+1][j], dp[i+1][j+1]) + nums[i][j];
                }
            }
            cout << dp[1][1] << endl;
        }
        return 0;
    }
    
  • 相关阅读:
    IOS:接口返回包含转义字符去掉转义字符
    properties和yml进行对比
    IDEA安装插件时搜索不到,一直在转圈刷新,无法安装
    VMware 15 虚拟机黑屏问题
    扩容根分区
    CentOS 6 各种启动文件损坏及修复
    RabbitMQ面试题
    FTP,SFTP服务器登录权限和根目录的设置
    Tee命令的几个使用实例
    ssh-copy-id 后无法免密登录
  • 原文地址:https://www.cnblogs.com/yinzm/p/7427800.html
Copyright © 2020-2023  润新知