posts - 25,  comments - 0,  trackbacks - 0
/*
给定一个由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] >= 0return 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;
}

posted on 2011-10-08 01:24 nk_ysg 阅读(789) 评论(0)  编辑 收藏 引用 所属分类: 算法

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理