一个简单的c题目,可就是想不通,请教大虾!!!
背景介绍:
goldfisher为了解救被绑架的未婚妻而来到了恶魔岛。上岛前,一个神秘的印度人yingnan告诉他恶魔岛处处布满陷阱,只有沿着地上标记数字和为最大的路径才能找到公主。为此他给goldfisher画了一个草图,假使地上标记的数字如下:
1
2 3
1 5 9
9 1 1 1
其中的最大路径是1-3-9-1,最大的和是14,只有沿着这条路径走,才能找到公主。goldfisher犯难了,因为现实中标记的数字更多,难度更大。你能帮助goldfisher找到正确的道路解救他的未婚妻吗?
(作者:ZUCC ACM 03级队员 胡横)
注:地图为等腰三角形,必须置顶向下,且每次仅能访问相邻两个子路径。本例中:
第一层 1 可达 2、3 两点
第二层 2 可达 1、5 两点 ; 3 可达 5、9 两点,以此类推
输入:
本题包含多组测试数据,其中第一行为N(1 <= N <= 65535),表示将要进过的关卡数。
接下来N行为通往目的地图。
输出:
输出 It will take him s steps!
其中 s为对应地图最长路径值。
输入样例:
4
1
2 3
1 5 9
9 1 1 1
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
输出样例:
It will take him 14 steps!
It will take him 30 steps!
[解决办法]
#include <stdio.h>
#define MAXX(64*1024)
#define xmax( a , b )((a)> =(b)?(a):(b))
int main()
{
while( 1 )
{
int n , i , j , c1[MAXX] , c2[MAXX] , *p1 = c1, *p2 = c2, *t;
scanf( "%d%d " , &n , &p1[0] );
for( i = 2; i <= n; ++i )
{
for( j = 0; j < i; ++j )
scanf( "%d " , &p2[j] );
p2[0]+=p1[0]; p2[i-1]+=p1[i-2];
for( j = 1; j+1 <i; ++j )
p2[j] += xmax( p1[j-1] , p1[j] );
t = p1 , p1 = p2 , p2 = t;
}
for( i = 1 , j = p1[0]; i < n; ++i ) j = xmax( j , p1[i] );
printf( "It will take him %d steps!\n " , j );
}
return 0;
}