数字三角形


总时间限制: 1000ms 内存限制: 65536kB



描述

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

    (图1)
图1给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和。

输入

输入的是一行是一个整数N(100>=N>=1),给出三角形的行数。下面的N行给出数字三角形。数字三角形上的数的范围都在0和100之间。

输出

输出最大的和。

样例输入

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

样例输出

  1. 30

思路

1.搜索

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int a[105][105],s;
  4. int dfs(int i,int j)
  5. {
  6. if(i==s)
  7. return a[i][j];
  8. return a[i][j]+max(dfs(i+1,j),dfs(i+1,j+1));
  9. }
  10. int main()
  11. {
  12. cin>>s;
  13. for(int i=1;i<=s;i++)
  14. for(int j=1;j<=i;j++)
  15. cin>>a[i][j];
  16. cout<<dfs(1,1);
  17. return 0;
  18. }

时间复杂度为\(O(2^n)\),最大为\(O(2^{100}),\)超时。

2.记忆化搜索

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int a[105][105],s,b[105][105];
  4. int dfs(int i,int j)
  5. {
  6. if(i==s)
  7. return a[i][j];
  8. if(b[i][j]!=0)
  9. return b[i][j];
  10. b[i][j]=a[i][j]+max(dfs(i+1,j),dfs(i+1,j+1));
  11. return b[i][j];
  12. }
  13. int main()
  14. {
  15. cin>>s;
  16. for(int i=1;i<=s;i++)
  17. for(int j=1;j<=i;j++)
  18. cin>>a[i][j];
  19. cout<<dfs(1,1);
  20. return 0;
  21. }

由于每个位置只搜索了一次,所以时间复杂度为\(O(n^2)\),通过 ! ! !

3.递推(顺推)

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int a[105][105],s;
  4. int main()
  5. {
  6. cin>>s;
  7. cin>>a[1][1];
  8. for(int i=2;i<=s;i++)
  9. {
  10. cin>>a[i][1];
  11. a[i][1]+=a[i-1][1];
  12. for(int j=2;j<=i;j++)
  13. {
  14. cin>>a[i][j];
  15. a[i][j]+=max(a[i-1][j],a[i-1][j-1]);
  16. }
  17. }
  18. int maxx=-1;
  19. for(int j=1;j<=s;j++)
  20. maxx=max(maxx,a[s][j]);
  21. cout<<maxx;
  22. return 0;
  23. }

同样,时间复杂度为\(O(n^2)\),通过 。

4.递推(逆推)

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int a[105][105],s;
  4. int main()
  5. {
  6. cin>>s;
  7. for(int i=1;i<=s;i++)
  8. for(int j=1;j<=i;j++)
  9. cin>>a[i][j];
  10. for(int i=s-1;i>=1;i--)
  11. for(int j=1;j<=i;j++)
  12. a[i][j]+=max(a[i+1][j],a[i+1][j+1]);
  13. cout<<a[1][1];
  14. return 0;
  15. }

不用多说,时间复杂度也为\(O(n^2),\)通过。


&nbsp 以上便是此题的多种解法,欢迎下次再来。

[IOI 1994]数字三角形的更多相关文章

  1. G:数字三角形

    总时间限制: 1000ms 内存限制: 65536kB描述73   88   1   02   7   4   44   5   2   6   5 (图1) 图1给出了一个数字三角形.从三角形的顶部 ...

  2. 4829 [DP]数字三角形升级版

    4829 [DP]数字三角形升级版  时间限制: 1 s  空间限制: 16000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description 从数字三角形的顶部(如图, ...

  3. 【递归】数字三角形 简单dp

    [递归]数字三角形 题目描述 对于大多数人来说,“我们是这么的正常,因此也就这么的平庸.”而天才总是与众不同的,所以当邪狼问修罗王:“老大,你蹲在那儿一动不动看了有半个小时了,蚂蚁有那么好看吗?” 修 ...

  4. hihocoder 1037 数字三角形

    #1037 : 数字三角形 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 问题描述 小Hi和小Ho在经历了螃蟹先生的任务之后被奖励了一次出国旅游的机会,于是他们来到了大洋彼岸 ...

  5. lintcode:数字三角形

    题目: 数字三角形 给定一个数字三角形,找到从顶部到底部的最小路径和.每一步可以移动到下面一行的相邻数字上. 样例 比如,给出下列数字三角形: [      [2],     [3,4],    [6 ...

  6. 1989-C. 数字三角形

    描述 如图所示,是一个数字搭成的三角形. 若起始位置在三角形的顶端,结束位置在三角形底边,每一步只能向下方或向右下角移动一格.请编程计算一条路径,使得路径上经过的数字和最大.(图中路径7→3→8→7→ ...

  7. 洛谷P1118 数字三角形游戏

    洛谷1118 数字三角形游戏 题目描述 有这么一个游戏: 写出一个1-N的排列a[i],然后每次将相邻两个数相加,构成新的序列,再对新序列进行这样的操作,显然每次构成的序列都比上一次的序列长度少1,直 ...

  8. HDU 1176 免费馅饼(数字三角形)

    免费馅饼 Problem Description 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉 ...

  9. [CODEVS1220]数字三角形

    题目描述 Description 如图所示的数字三角形,从顶部出发,在每一结点可以选择向左走或得向右走,一直走到底层,要求找出一条路径,使路径上的值最大. 输入描述 Input Description ...

随机推荐

  1. sql 简单分页查询(ror_number() over)

    SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (ORDER BY ID DESC ) AS r_num FROM (select * from #table ...

  2. PIE SDK归一化水体指数法

    1.算法功能简介 归一化指数法(NDWI(Normalized Difference Water Index,归一化水指数)),用遥感影像的特定波段进行归一化差值处理,以凸显影像中的水体信息. 其表达 ...

  3. 程序游戏推荐(C语言贪吃蛇,python天天酷跑(需要安装pygame),js是狠人就坚持30s)

    下面是下载位置,我把他们上传到我的文件下了. C语言贪吃蛇:https://files.cnblogs.com/files/ITXiaoAng/%E8%B4%AA%E5%90%83%E8%9B%87. ...

  4. Nuxt中使用Vant,完成通知栏Notify的提示

    第一次移动端开发,UI方面选择了使用vant框架,但是vant官网写的使用,在nuxt项目中照搬官方的实例,各种报错,所以还得靠自己(使用方法在最后) 官方实例: 方法一:直接复制粘贴的时候,报错No ...

  5. ASP.NET Core使用Quartz定时调度

    在应用程序开发过程中,经常会需要定时任务调度功能,本篇博客介绍Asp.net Core如何使用Quartz完成定时调度 一.Quartz使用步骤 创建调度器scheduler,并开启 创建Job作业 ...

  6. vue-cli的安装及版本查看更新

    vue-cli安装 npm install vue-cli -g vue-cli的版本查看 vue -V vue-cli的3.0+以后使用的不是vue-cli了,如果用以上的安装命令安装的并不是最新版 ...

  7. 渗透技巧——导出Chrome浏览器中保存的密码

    0x00 前言 在后渗透阶段,获得权限后需要搜集目标系统的信息.信息越全面,越有助于进一步的渗透.对于Windows系统,用户浏览器往往包含有价值的信息. 在之前的文章<本地密码查看工具LaZa ...

  8. Python之路(第四十七篇) 协程:greenlet模块\gevent模块\asyncio模块

    一.协程介绍 协程:是单线程下的并发,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的. 协程相比于线程,最大的区别在于 ...

  9. 指针专题6-空指针NULL和void指针

    1 NULL指针 一个指针变量可以指向计算机中任何一块内存,不管该内存有没有被分配,也不管该内存有没有使用权限,只要把地址给他,他就可以指向.C语言没有一种机制保证指向内存的正确性,程序员必须自己提高 ...

  10. Linux内存含义

    关于Linux的内存,首先要先知道各个部分的含义 1. 命令:  free -m     // Mb 显示 1,total:物理内存实际总量2,used:这块千万注意,这里可不是实际已经使用了的内存哦 ...