- 论坛徽章:
- 0
|
版主方法不对,以这个例子为例:
3
7 4
2 4 6
8 5 9 3
用版主的方法可以计算得到3+7+4+9 = 23,如果将左下角的8换成99,这种方法就得不出正确结论了。
我的办法是假定最后一个元素是$data[$n][$i],那么就有sum[$n][$i] = max($data[$n][$i] +sum[$n-1][$i],$data[$n][$i]+sum[$n-1][$i-1],代码如下:- #!/usr/bin/perl
- use strict;
- use warnings;
- use 5.010;
- my @data = (
- [qw(75)],
- [qw(95 64)],
- [qw(17 47 82)],
- [qw(18 35 87 10)],
- [qw(20 04 82 47 65)],
- [qw(19 01 23 75 03 34)],
- [qw(88 02 77 73 07 63 67)],
- [qw(99 65 04 28 06 16 70 92)],
- [qw(41 41 26 56 83 40 80 70 33)],
- [qw(41 48 72 33 47 32 37 16 94 29)],
- [qw(53 71 44 65 25 43 91 52 97 51 14)],
- [qw(70 11 33 28 77 73 17 78 39 68 17 57)],
- [qw(91 71 52 38 17 14 91 43 58 50 27 29 48)],
- [qw(63 66 04 68 89 53 67 30 73 16 69 87 40 31)],
- [qw(04 62 98 27 23 09 70 98 73 93 38 53 60 04 23)],
- );
- sub max{
- my ($x,$y) = @_;
- if($x>$y){
- return $x;
- }else{
- return $y;
- }
- }
- sub sum{
- my ($row,$column) = @_;
- my ($sum1,$sum2);
- if(0>$column){
- say 'stop';
- return 0;
- }elsif($column>$row){
- say 'stop';
- return 0;
- }
- if(0==$row){
- say 'error';
- return undef;
- }elsif(1==$row){
- $sum1 = $data[0][0]+$data[1][0];
- $sum2 = $data[0][0]+$data[1][1];
- say "row\t$row\tcolumn\t$column\t",$data[$row][$column];
- return max($sum1,$sum2);
- }else{
- $sum1 = sum($row-1,$column)+$data[$row][$column];
- $sum2 = sum($row-1,$column-1)+$data[$row][$column];
- say "row\t$row\tcolumn\t$column\t",$data[$row][$column];
- return max($sum1,$sum2);
- }
- }
- my @sums;
- for(0..14){
- push @sums,sum(14,$_);
- say $sums[-1];
- }
- say join "\n",@sums;
复制代码 |
|