小学期第一套题总结与反思

从今天起开始写博客,666;

也差不多相当于是心得,经验等一些东西。

小学期已经过去了一个星期了,自己也差不多刷完了一大半的题,因为这段时间自己个人的努力,小学期验收代码还是过得十分愉快的,现在在7.13号花点时间写一点东西。

针对作业一 二十道题的整体回顾,



1.

【问题描述】

给定一个数塔,如下图所示。在此数塔中,从顶部出发,在每一节点可以选择走左下或右下,一直走到底层。请找出一条路径,使路径上的数值和最大。



【输入形式】

输入时第一行一个整数n,表示该数塔的行数,其余n行表示该塔每行的数值

【输出形式】

输出包含两行,第一行为最大路径上的数值之和, 第二行n个数字为从上而下最大路径数值

【样例输入】

 

【样例输出】

基本思路:这道题其实自己一开始也并没有很好的想法,想从头到尾暴力出所有结果,再输出最大的,发现情况真的太多了,

然后只好百度一下了,发现了前人很好的思路,就是从最下面一层开始,一层一层往上寻找最大的。

举个例子就比如样例2有两个选择,要么向下,要么右下,也就是说2的位置的值应该取max{19+2,7+2}很显然是21;倒数第二行就变成了21 28 19 21,就这样继续往上回溯,会发现当回溯到最初的第一行时就只剩下我们需要的那个最大的数了;这样就解决了第一个问题;题目还需要我们输出对应的路径,这个时候我们就需要再开一个数组,把原来的输入数塔复制保留下来,然后在第一个数组的基础上进行回溯找最大,第一个数组的每个值都随之发生改变。我们就从第一个数组的第一行开始,对应的时我们的最大值,借用第二个数组,一层层往下寻找我们的最大路径。

比如第一个数组和第二个数组第一二行分别是 ,59-1=58;说明58所占的那个位置 的3就是路径上的数。

关键代码: 这里主要说一下,两处代码,一处是寻找最大,往上回溯的代码,一处是寻找最大路径往下寻找的代码,这题也就这两处有点意思。

int n;

cin>>n;

int a[n][n],b[n][n];

for(int i=0;i<n;i++)

{for(int j=0;j<=i;j++)

cin>>a[i][j];

b[i][j]=a[i][j];

}//这是前面铺垫的代码;接下来来到了我们关键第一处代码;

for(int i=n-1;i>0;i--)

{

    for(int j=0;j<i;j++)

{

        if(a[i][j]>a[i][j+1])

a[i-1][j]=a[i-1][j]+a[i][j];

else a[i-1][j]+=a[i][j+1];

}

}//第一处关键代码完成,找到了最大a[0][0];开始正向寻找最大路径;

这是第二处关键代码至此,本题没有其他什么难度了!接下来我们就用devC++运行一下,先自我检查一下,额检查之后就发现了问题,第二段代码有问题,输出的结果和想象的不一样,并不是我们想让她输出的样子,再看一下第二段代码,发现逻辑上有问题,现修改成

执行,再提交,完美,100分,此代码未借助任何人或东西,纯人工手写;上面的问题大家应该都能看出来,献丑了,在这里我就不解释错误了,留给读者思考。

附代码



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值