算法1:递归
设 f(i, j) 是从(i, j)点出发向下走的最长路径。
f(i, j) = max(f(i+1, j),f(i+1, j+1) ).
输出f(0, 0).
code:
#
include<iostream.h>
#
defineMAX101
inttriangle[
MAX
][
MAX
];
intn;
intlongestPath(inti
,
intj);
voidmain(){
inti
,
j;
cin
>>
n;
for
(i
=
0
;i
<
n;i
++
)
for
(j
=
0
;j
<=
i;j
++
)
cin
>>
triangle[i][j];
cout
<<
longestPath(
0
,
0
)
<<
endl;
}
intlongestPath(inti
,
intj){
if
(i
==
n)
return
0
;
intx
=
longestPath(i
+
1
,
j);
inty
=
longestPath(i
+
1
,
j
+
1
);
if
(x
<
y)
x
=
y;
return
x
+
triangle[i][j];
}
超时!!!
原因:大量重复计算
f(0, 0) = max(f(1, 0),f(1, 1) ).
f(1, 0) = max(f(2, 0),f(2, 1) ).
f(1, 1) = max(f(2, 1),f(2, 2) ).
f(2, 0) = max(f(3, 0),f(3, 1) ).
f(2, 1) = max(f(3, 1),f(3, 2) ).
f(2, 2) = max(f(3, 1),f(3, 2) ).
。
。
。
f(4, 0) = max(f(5, 0),f(5, 1) ).
。
。
算法2:动态规划
一般的转化方法:
原来递归函数有几个参数,就定义一个几维的数组,数组的下标是递归函数参数的取值范围,数组元素的值是递归函数的返回值,这样就可以从边界开始,逐步填充数组,相当于计算递归函数值的逆过程。
code:
#
include<stdio.h>
#
defineMAX100
inttriangle[
MAX
][
MAX
];
intmain()
{
intn
,
i
,
j;
scanf(
"
%d
"
,
&
n);
for
(i
=
0
;i
<
n;i
++
)
for
(j
=
0
;j
<=
i;j
++
)
scanf(
"
%d
"
,
triangle[i]
+
j);
for
(i
=
n
-
2
;i
>=
0
;i
--
)
for
(j
=
0
;j
<=
i;j
++
)
triangle[i][j]
+=
triangle[i
+
1
][j]
>
triangle[i
+
1
][j
+
1
]
?
triangle[i
+
1
][j]
:
triangle[i
+
1
][j
+
1
];
printf
(
"
%d/n
"
,
triangle[
0
][
0
]);
return
0
;
}
本文介绍了一种求解三角形网格中最长路径的问题,通过对比递归算法与动态规划方法,展示了如何避免重复计算来提高效率。
1217

被折叠的 条评论
为什么被折叠?



