算法1:递归

设 f(i, j) 是从(i, j)点出发向下走的最长路径。

f(i, j) = max( f(i+1, j),  f(i+1, j+1) ).

输出f(0, 0).

code:

(转)POJ 1163 The Triangle 解题报告#include <iostream.h>
(转)POJ 1163 The Triangle 解题报告#
define MAX 101
(转)POJ 1163 The Triangle 解题报告
int triangle[MAX][MAX];
(转)POJ 1163 The Triangle 解题报告int n;
(转)POJ 1163 The Triangle 解题报告int longestPath(int i
,int j);
(转)POJ 1163 The Triangle 解题报告void main(){
(转)POJ 1163 The Triangle 解题报告    int i
,j;
(转)POJ 1163 The Triangle 解题报告    cin 
>> n;
(转)POJ 1163 The Triangle 解题报告    
for(i=0;i<n;i++
(转)POJ 1163 The Triangle 解题报告        
for(j=0;j<=i;j++)
(转)POJ 1163 The Triangle 解题报告            cin
>> triangle[i][j];
(转)POJ 1163 The Triangle 解题报告        cout
<<longestPath(0,0<<endl;
(转)POJ 1163 The Triangle 解题报告}
(转)POJ 1163 The Triangle 解题报告int longestPath(int i
,int j){
(转)POJ 1163 The Triangle 解题报告    
if(i==n) 
(转)POJ 1163 The Triangle 解题报告        
return 0;
(转)POJ 1163 The Triangle 解题报告    int x 
=longestPath(i+1,j);
(转)POJ 1163 The Triangle 解题报告    int y 
=longestPath(i+1,j+1);
(转)POJ 1163 The Triangle 解题报告    
if(x<y) 
(转)POJ 1163 The Triangle 解题报告        x
=y;
(转)POJ 1163 The Triangle 解题报告    
return x+triangle[i][j];
(转)POJ 1163 The Triangle 解题报告}

超时!!!

原因:大量重复计算

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:

(转)POJ 1163 The Triangle 解题报告#include<stdio.h>
(转)POJ 1163 The Triangle 解题报告#
define MAX 100
(转)POJ 1163 The Triangle 解题报告
int triangle[MAX][MAX];
(转)POJ 1163 The Triangle 解题报告int main()
(转)POJ 1163 The Triangle 解题报告{
(转)POJ 1163 The Triangle 解题报告    int n
, i, j;
(转)POJ 1163 The Triangle 解题报告    scanf(
"%d", &n);
(转)POJ 1163 The Triangle 解题报告    
for(i=0; i<n; i++)
(转)POJ 1163 The Triangle 解题报告        
for(j=0; j<=i; j++)
(转)POJ 1163 The Triangle 解题报告            scanf(
"%d", triangle[i]+j);
(转)POJ 1163 The Triangle 解题报告    
for(i=n-2; i>=0; i--)
(转)POJ 1163 The Triangle 解题报告        
for(j=0; j<=i; j++}

相关文章:

  • 2022-12-23
  • 2021-08-27
  • 2021-09-07
  • 2022-12-23
  • 2022-01-29
猜你喜欢
  • 2021-11-09
  • 2022-12-23
  • 2021-04-30
  • 2021-09-07
  • 2021-09-09
  • 2021-07-10
相关资源
相似解决方案