[科技部与你共成长] 两道题
3 8
8 1 0
2 7 4 4
4 5 2 6 5
The above figure shows a number triangle. 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.
上图显示了一个数字三角,请编写程序计算从顶点到最底层的一条路径能得到的最大和。
----------------------------------------------------------------------------------------------
答案:
第一道,我的思路是,首先声明变量,整形的z=0,n=负无穷,p=正无穷,sum=1,然后遍历一遍,遍历的过程中作如下工作
:依次读入每一个数,
如果不是0,则乘到sum上,并且如果是负数同时又比n大的话,则更新n为这个值;如果是正数又比p小的话,将p更新为这个值
如果是0,则不乘到sum上,并且z++;//z记录数列中0的个数,当z大于1时整个程序跳出,返回最大可能值0
遍历完之后,如果z=1,并且sum为负数,则返回0;如果z=1并且sum为正数,则返回sum
如果z=0并且sum为负数,则返回sum/n,如果z=0并且sum为正数则返回sum/p;
复杂度的话,遍历一遍为n,要做o(n)次乘法,每次比较的复杂度为2n,最后的复杂度为O(n);
第二道题:
贴一下我的代码,仅供参考,可以AC
#include <iostream>
#include<math.h>
using namespace std;
int main()
{
int n;cin>>n;
int total=(1+n)*n/2,*num=new int[total] ;
for(int i=0;i<total;i++)
cin>>num[i];
for(int i=total-1;i>0;i--)//从最后一个数算起
{
int line=sqrt(i*2+0.25)-0.5;//计算当前在第几行
if(i!=(1+line)*line/2)
num[i-line-1]=num[i-line-1]+(num[i]>num[i-1]?num[i]:num[i-1]);//迭代更新当前数所在的小三角内的顶点值
}
cout<<num[0]<<endl;//更新到最后顶点处保存的就是最大的和
return 0;
}