第三章实践心得

1、问题描述:

给定一个由 n行数字组成的数字三角形如下图所示。试设计一个算法,计算出从三角形 的顶至底的一条路径(每一步可沿左斜线向下或右斜线向下),使该路径经过的数字总和最大。

2、算法描述:

for(i=1;i<=n;i++){
    for(j=1;j<=i;j++){
     cin>>a[i][j]; }  }

for(j=1;j<=n;j++)
       dp[n][j]=a[n][j];
    for(i=n-1; i>=1; i--)
    {
     for(j=1; j<=i; j++)
     {
      dp[i][j]= a[i][j]+ max(dp[i+1][j], dp[i+1][j+1]);
     }
    }
    cout<<dp[1][1];

定义一个新数组dp[]来存放路径最长的总和,通过一个递归算法,自底向上,dp[n-1] = a[i][j]+ max(dp[i+1][j], dp[i+1][j+1]),最后dp[1][1]的值就是最大总和。

3、算法空间、时间复杂度分析:

该算法的最高阶是循环嵌套,因此时间复杂度为:n*(n-1)+(n-1)+......+2*1

O(n)=n*n;

空间复杂度为n*n;

4、心得体会:

本题算法是动态规划中的基础所以比较简单,但在上机的时候因为一开始设置的数组比较小导致结果一直出错,所以今后还是多注意一些语法问题。

原文地址:https://www.cnblogs.com/sxdl/p/9905071.html

时间: 2024-10-07 16:46:53

第三章实践心得的相关文章

《构建之法》第三章学习心得

这周我学习了<构建之法>第三章,讲述了软件工程师的成长.软件系统的绝大部分模块都是由个人开发或维护的.在软件工程的术语中,这些单个的成员叫做Individ-ual Contributor(IC).IC在团队中的流程是怎么样的呢?以开发人员为例,流程如下. 1.通过交流.实验.快速原型等方法,理解问题.需求或任务 2.提出多种解决办法并估计工作量 3.其中包括寻找以前的解决方案,因为很多工作是重复性的 与相关角色交流解决问题的提案,决定一个可行的方案 执行,把想法变成实际中能工作的代码,同时验证

构建之法第三章读书心得

在构建之法第三章中,我们主要学习了个人能力的衡量与发展. 初级软件工程师有以下几个成长阶段:1.积累软件开发相关的知识,提升技术技能. 2.积累问题领域的知识和经验. 3.对通用的软件设计思想和软件工程思想的理解 4.提升职业技能 5.实际成果 软件开发的工作量和质量你的衡量标准:1.项目.任务有多大? 2.花了多少时间? 3.质量如何?交付的代码中有多少缺陷?

201671010105 2016-2017-2《Java程序设计》第三章学习心得

通过学习第三章,我的总结有以下几点: 先说内容,第三章我们主要学习的是java的基本程序设计结构,学习了与之相关的一些内容,注释,数据类型,变量,运算符,字符串,输入输出语句,数组等等,在这些内容中,有些是在C语言中同样可以学到的,我们上学期已经学过,但也有很多是与c不一样的,是首次接触,比如注释,无论是java还是c语言,对于编程者而言,给自己编写的程序注释是一种良好的习惯,不止自己看懂,别人也能看懂,又比如数据类型,java中多了byte(字节型)和boolean(布尔型).在后面内容中也有

大道至简 第三章 阅读心得

第三章的主题是“团队缺乏的不只是管理”,在本章节作者举了鲜活的具体事例向读者深刻清晰地分析论述许多公司团队组建中的.当前面临的或者已经经历过的关键难题,运用他丰富的经验告诉我们应该如何去做,对于软件公司组建新团队,管理团队,或者是管理转型非常具有意义. 团队指的是大于2个人的队伍,在团队工作中由于自我定位不平衡,很容易出现工作量付出不相等的矛盾,就好比“一个和尚挑水喝,两个和尚抬水喝,三个和尚没水喝”,如何给每个人一个清晰地分工定位是很重要的,因为对于一个项目的开发,编写程序代码所占的重量不大,

第三章实践

1.实践题目数字三角形 2.问题描述给定一个由 n行数字组成的数字三角形如下图所示.试设计一个算法,计算出从三角形 的顶至底的一条路径(每一步可沿左斜线向下或右斜线向下),使该路径经过的数字总和最大. 3.算法描述递归式为:b[i][j]=max(b[i+1][j]+a[i][j],b[i+1][j+1]+a[i][j])从下往上加,比较相邻两个数大小,加上大的那个数,填入记录的数组中,不断以此类推. 4.算法时间及空间复杂度分析(要有分析过程)时间复杂度:主体为两个for循环,所以时间复杂度为

【实践报告】算法第三章实践报告

1.实践题目 7-2最大子段和 给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],-,a[n],求该序列如a[i]+a[i+1]+-+a[j]的子段和的最大值.当所给的整数均为负数时,定义子段和为0. 要求算法的时间复杂度为O(n). 2.问题描述 输入格式: 输入有两行: 第一行是n值(1<=n<=10000): 第二行是n个整数. 输出格式: 输出最大子段和. 输入样例: 在这里给出一组输入.例如: 6 -2 11 -4 13 -5 -2 输出样例: 在这里给出相应的输出.

第三章实践报告

实践题目:数字三角形 题目描述: 设计一个算法,计算出从三角形 的顶至底的一条路径(每一步可沿左斜线向下或右斜线向下),使该路径经过的数字总和最大. 算法描述:从下至上依次左右比较,大的那方和上面的数相加,直至第一列. 算法时间和空间复杂度分析:因为用到了双重循环,所以时间复杂度为o(n^2),同时使用了二维数组,所以空间复杂度也是o(n^2). 心得:这道题用从下至上的方法比较简单,要有逆向思维. 原文地址:https://www.cnblogs.com/ewerin/p/9943461.ht

第三章读书心得

本章主要讲了git的使用入门,让我明白了一些知识: 安装Git1.# apt-get install git2.# apt-get install git-doc git-svn git-email git-gui gitk查看Git文档1.查询git-checkout 命令的帮助文档,使用命令:# man git-checkout 2.查询git-checkout 命令的文档,使用命令:# git help git-checkout3.查询HTML格式的git-checkout 命令的文档,使

算法第三章实践

1. 问题: 所以问题的核心是:如何找到最优路径,得到最大的和? 2. 思路:我一开始的思路是,从顶点开始,比较左右两点的大小,然后取最大值的完事了. 然后结果是28. 为什么呢?原来判断到8的时候,会往右走,但是最大值的路径在最左边的,只要往右走了就无法得到最大值. 3. 算法:最后看了网上的博客,看着c++用python打了一遍,(不过是从山脚下开始的,跟oj的热身赛一样). for i in range(num-1, 0, -1): i -= 1 for n in range(i): if