百练3727摘花生

      前几天在百练看到这题,题意主要是输入一个二维数组,行和列不大于100,求从左上点到右下点经过的所有节点值之和的最大值,行走路线只能向下或向右。

      由于有多组数据需要输入,我就用一个函数处理每组数组,函数参数为一个数组,和其行和列数。没想到,一开始就在函数声明上花了好些时间,int getmax(int,int,int * [100]),其实这个错误的,*应该用括号括起来,int getmax(int,int,int (*)[100]),前者表示参数为100指针数组,后者表示为参数为一个指针,指向有100个元素的一维数组。在C语言中,括号和下标具有最高的优先级,所以这里的括号不能省略。

另外,还尝试了声明“动态”二维数组:int getmax(int,int ,int [*][*]),一般来说,多维数组除了第一维可以不用指定外,其他维数一定要指定大小,这里的定义其实是:第一个参数为数组的第一个下标,第二个参数为数组的第二个下标,而且定义的时候,数组必须放在后面。虽然可以申明这样的函数,结果却不尽人意,因为每次的调用,随着参数的改变,数组同样在改变,由于传递的数组一般是个常量,这就有可能导致未知的错误。

      第二步,编写函数内容。根据题意,假设一个二维数组num[n][m],每次都是从num[0][0]开始走到num[n-1][m-1]结束,如果只有一行,则返回这一行的和,如果只有一列,则返回这一列的和,即n为1或m为1时,返回值就为各元素之和。如果n 和 m都不是1,可以根据规则,按num[n-1][m-1]把整个数组分为两部分,一个是去掉最右边一列的数组和一个去掉最下边一行的数组,返回值应该就是num[n-1][m-1]加上上边提到的两个数组返回值较大的那个数组的返回值。现在我们就可以写一个递归函数:

 

这里,我们还需要一个求较大值的函数max(int ,int),或者宏:max(a,b) ((a)>(b)?(a):(b)),虽然宏为直接调用,但是宏参数为表达式的时候,表达式会计算两次,用宏还是用函数?

      另外,申明多维数组的时候,还要注意是否会没有分配到内存空间,这里我就申明了个数组num[100][100][100],结果,运行失败。

 

     一切看起来很美好,实际上用此递归函数,将会是一个噩梦,如果是3x3的数组,此函数会调用11次,4x4是39次,5x5是139次.....如果是100x100,我估计将会算好几天,所以这里用递归,完全是行不通。昨天有别个给我一个代码:

 

他是从每个输入开始计算最大值的路径,结果就ok了

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值