题目限制

Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 59262 Accepted: 35557
时间限制: 1000ms 内存限制: 10000k
提交:59262 接受:35557

Description

描述

             73   88   1   02   7   4   44   5   2   6   5

(Figure 1)
Figure 1 shows a number triangle.
图1显示了一个数字三角形。
Write a program that calculates the highest sum of numbers passed on a route that starts at the top and ends somewhere on the base.
编写一个程序,计算从顶部开始,在底部某个位置结束的路由上传递的最大数字总和。
Each step can go either diagonally down to the left or diagonally down to the right.
每一步都可以向左斜向下或向右斜向下。

Input

输入
Your program is to read from standard input.
您的程序将从标准输入中读取。
The first line contains one integer N: the number of rows in the triangle.
第一行包含一个整数n:三角形中的行数。
The following N lines describe the data of the triangle.
下面的n行描述了三角形的数据。
The number of rows in the triangle is > 1 but <= 100.
三角形中的行数大于1但小于等于100。
The numbers in the triangle, all integers, are between 0 and 99.
三角形中的数字,所有整数,都在0到99之间。

Output

输出
Your program is to write to standard output.
您的程序将写入标准输出。
The highest sum is written as an integer.
最高的和被写为一个整数。

Sample Input

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

Sample Output

30
Source
IOI 1994

解题思路

用二维数组存放数字三角形

D(i,j):第i行第j个数字(r,j从1开始算)
MaxSum(r,j):从D(i,j)到底边的各条路径,最佳路径的数字之和。

问题:求MaxSum(1,1)

典型的递归问题:
D(i,j)出发,下一步只能走到D(i+1,j)或者D(i+1,j+1)。

递归代码

#include <iostream>
#include <algorithm>
#define MAX 101
using namespace std;
int D[MAX][MAX];
int n;
int MaxSum(int i,int j)
{if(i==n){return D[i][j];}int x=MaxSum(i+1,j);int y=MaxSum(i+1,j+1);return max(x,y)+D[i][j];
}
int main()
{int i,j;cin>>n;for(int i=1;i<=n;i++){for(int j=1;j<=i;j++){cin>>D[i][j];}}cout<<MaxSum(1,1)<<endl;return 0;
}

想都不用想,肯定会:Time Limit Exceeded

为什么会超时?

重复计算:
如果采用递归的方法,深度遍历每条路径,存在大量重复计算,时间复杂度为2n

改进

如果每算出一个MaxSum()就保存起来,下次用到其值的时候直接取用,则可免去重复计算。
因为三角形的数字总数是n(n+1)/2,那么可以用O(n2)时间完成计算。

记忆递归型动态规划程序

#include <iostream>
#include <algorithm>
#define MAX 101
using namespace std;
int maxSum[MAX][MAX];
int D[MAX][MAX];
int n;
int MaxSum(int i,int j)
{if(maxSum[i][j]!=-1){return maxSum[i][j];}if(i==n){maxSum[i][j]=D[i][j];}else{int x=MaxSum(i+1,j);int y=MaxSum(i+1,j+1);maxSum[i][j]=max(x,y)+D[i][j];}return maxSum[i][j];
}
int main()
{int i,j;cin>>n;for(int i=1;i<=n;i++){for(int j=1;j<=i;j++){cin>>D[i][j];maxSum[i][j]=-1;}}cout<<MaxSum(1,1)<<endl;return 0;
}

递归转递推

从下往上,每两个数往上找一层最大数:

#include <iostream>
#include <algorithm>
#define MAX 101
using namespace std;
int D[MAX][MAX],n;
int maxSum[MAX][MAX];
int main ()
{cin>>n;for(int i=1;i<=n;i++){for(int j=1;j<=i;j++){cin>>D[i][j];if(i==n) maxSum[n][j]=D[n][j];}}for(int i=n-1;i>=1;i--){for(int j=1;j<=i;j++){maxSum[i][j]=max(maxSum[i+1][j],maxSum[i+1][j+1])+D[i][j];}}cout<<maxSum[1][1]<<endl;return 0;
}

空间优化

直接用D的最后一行存放maxSum

#include <iostream>
#include <algorithm>
#define MAX 101
using namespace std;
int D[MAX][MAX],n;
int * maxSum;
int main ()
{cin>>n;for(int i=1;i<=n;i++){for(int j=1;j<=i;j++){cin>>D[i][j];}}maxSum=D[n];for(int i=n-1;i>=1;i--){for(int j=1;j<=i;j++){maxSum[j]=max(maxSum[j],maxSum[j+1])+D[i][j];}}cout<<maxSum[1]<<endl;return 0;
}

The Triangle相关推荐

  1. [JS][C++]两题斐波那契数列:上台阶、triangle

    上台阶 时间限制: 3000MS 内存限制: 589824KB 题目描述: 有一楼梯共m级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第m级,共有多少走法? 注:规定从一级到一级有0种走法. ...

  2. 设计一个扩展自抽象类geometricobject的新的triangle类_C++ 接口(抽象类)

    C++ 接口(抽象类) 接口描述了类的行为和功能,而不需要完成类的特定实现. C++ 接口是使用抽象类来实现的,抽象类与数据抽象互不混淆,数据抽象是一个把实现细节与相关的数据分离开的概念. 如果类中至 ...

  3. 帕斯卡三角形(Pascal's triangle)

    // The following code is compiled on VC2005 // #include "stdafx.h" /*--------------------- ...

  4. [leedcode 118] Pascal's Triangle

    Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5, Retu ...

  5. [LeetCode 120] - 三角形(Triangle)

    问题 给出一个三角形,找出从顶部至底部的最小路径和.每一步你只能移动到下一行的邻接数字. 例如,给出如下三角形: [ [2], [3,4], [6,5,7], [4,1,8,3] ] 从顶部至底部的最 ...

  6. D - Triangle Partition HDU - 6300 sort(cmp)

    D - Triangle Partition HDU - 6300 题解 由于三点不共线,且三角形不相交,则对坐标排序,输出 #include<bits/stdc++.h> using n ...

  7. Leetcode 118:Pascal's Triangle 杨辉三角

    118:Pascal's Triangle 杨辉三角 Given a non-negative integer numRows, generate the first numRows of Pasca ...

  8. LintCode: Triangle

    C++ 逆推 1 class Solution { 2 public: 3 /** 4 * @param triangle: a list of lists of integers. 5 * @ret ...

  9. [LeetCode]--118. Pascal#39;s Triangle

    Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5, Retu ...

  10. spoj453 Sums in a Triangle (tutorial) 动态规划

    题意:给出一个三角矩形,求从顶部到最底部的最大值 思路:动态规划,用 dp(i,j)表示从(0,0)到(i,j)的最大值,有dp(i,j)= max(dp(i-1,j-1) , dp(i-1,j)+m ...

最新文章

  1. 给 Spring Boot 项目减减肥!18.18M 到 0.18M 是如何做到的?
  2. 数据如何从HBase读到MR
  3. java变量设置_java的安装与环境变量设置
  4. html外边距的复合属性是,margin
  5. 谷歌浏览器出现“远程计算机访问失败问题”
  6. httpd的一些知识点
  7. spring mysql防注入攻击_【spring】(填坑)sql注入攻击 - 持久层参数化
  8. android之三星手机权限问题解决方案
  9. 解决android.support.multide... keeps stopping问题
  10. 阿里云_云计算_基础框架_Punrain
  11. 海南三亚游记2022-2023跨年
  12. Python编程实现数字图像的网络爬虫
  13. JAVA 关于hasNext的白话理解
  14. activiti工作流,审批系统轻松落地,请假审批demo从流程绘制到审批结束实例
  15. 22年春福师《大学英语(1)》在线作业一-1
  16. ant-design的Table组件暂无数据,滚动条位置修改
  17. excel中文本格式如何批量转化成数字
  18. [ZJOI 2016] bzoj 4455 小星星 - 容斥
  19. MySQL-彻底让你搞懂mysql索引
  20. matlab容差,绝对值容差 - MATLAB - MathWorks 中国

热门文章

  1. iOS 更改项目名称
  2. 你用哪种工具进行iOS app自动化功能测试?
  3. android 加载多个图片 内在溢出的问题
  4. usaco1.4.4(milk3)
  5. linux 开机自动启动服务
  6. 你人脉网中应该有的10种人
  7. python批量处理txt_浅谈Python批处理文件夹中的txt文件
  8. Ogitor的编译配置全过程
  9. JAVA web 会话技术CookieSession
  10. Mac模拟慢速网络 - Network Link Conditioner 安装和使用