数字三角形(记忆化搜索和递归)

数字三角形(记忆化搜索和递归)
/*
给定一个由n行数字组成的数字三角形如下图所示。
试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和
对于给定的由n行数字组成的数字三角形,
编程计算从三角形的顶至底的路径经过的数字和的最大值
 
*/
#include 
< stdio.h >
#include 
< string .h >

const   int  MAXN  =   100   +   10 ;

int  a[MAXN][MAXN],d[MAXN][MAXN];
int  n;

inline 
int  max( int  a, int  b) {  return  a  >  b  ?  a : b;}

int  dfs( int  i, int  j)
{
    
if  (d[i][j]  >=   0 return  d[i][j];
    
return  d[i][j]  =  a[i][j]  +  (i  ==  n  ?   0  : max(dfs(i + 1 ,j),dfs(i + 1 ,j + 1 )));
}

int  main()
{
    
int  i;
    
int  j;
    freopen(
" 1.txt " , " r " ,stdin);
    
while  (scanf( " %d " , & n)  !=  EOF)
    {
        memset(d,
- 1 , sizeof (d));
        
for  (i  =   1 ; i  <=  n;  ++ i)
        {
            
for  (j  =   1 ; j  <=  i;  ++ j)
                scanf(
" %d " , & a[i][j]);
        }
        printf(
" %d\n " ,dfs( 1 , 1 ));
    }
    
return   0 ;
}

#include  < stdio.h >

const   int  MAXN  =   100   +   10 ;

int  a[MAXN][MAXN],d[MAXN][MAXN];

int  n;

inline 
int  max( int  a,  int  b) {  return  a  >  b  ?  a : b; }

int  main()
{
    
int  i,j;
    freopen(
" 1.txt " , " r " ,stdin);
    
while  (scanf( " %d " , & n)  !=  EOF)
    {
        
for  (i  =   1 ; i  <=  n;  ++ i)
            
for  (j  =   1 ; j  <=  i;  ++ j)
                scanf(
" %d " , & a[i][j]);

        
for  (j  =   1 ; j  <=  n; j ++ ) d[n][j]  =  a[n][j];
        
for  (i  =  n  -   1 ; i  >=   1 ; i -- )
            
for  (j  =   1 ; j  <=  i; j ++ )
                d[i][j] 
=  a[i][j]  +  max(d[i + 1 ][j],d[i + 1 ][j + 1 ]);
        printf(
" %d\n " ,d[ 1 ][ 1 ]);
    }

    
return   0 ;
}

你可能感兴趣的:(数字三角形(记忆化搜索和递归))