数字三角形(OpenJ_Bailian 2760)
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
(图1)
图1给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和。
注意:路径上的每一步只能从一个数走到下一层上和它最近的左边的那个数或者右边的那个数。
Input
输入的是一行是一个整数N (1 < N <= 100),给出三角形的行数。下面的N行给出数字三角形。数字三角形上的数的范围都在0和100之间。
Output
输出最大的和。
Sample Input
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
Sample Output
30
题意描述:给数字三角形,从三角形的顶部到底部有很多条不同的路径。路径上的每一步只能从一个数走到下一层上和它最近的左边的那个数或者右边的那个数。对于每条路径,把路径上面的数加起来可以得到一个和,找到里面最大的和。
解题思路:先利用二维数组存每个数值,然后从三角形行数-1行开始走,先遍历最后一行计算倒数第二行的新值,依此类推,最后输出三角形顶端的那个数即可,也可以正着行走(具体看AC2)。
AC1
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; #define N 200 int main(void) { int n; int e[N][N]; while(~scanf("%d",&n)) { memset(e,0,sizeof(e)); for(int i=1;i<=n;i++) for(int j=1;j<=i;j++) scanf("%d",&e[i][j]); for(int i=n-1;i>=1;i--) for(int j=1;j<=i;j++) e[i][j]=max(e[i+1][j],e[i+1][j+1])+e[i][j]; printf("%d\n",e[1][1]); } return 0; }
AC2
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 200
using namespace std;
int main(void)
{
int e[N][N];
int ans=-99999999;
int n,ans;
while(~scanf("%d",&n))
{
ans=-99999999;
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
scanf("%d",&e[i][j]);
for(int i=2;i<=n;i++)
for(int j=1;j<=i;j++)
e[i][j]=max(e[i-1][j-1],e[i-1][j])+e[i][j];
for(int i=1;i<=n;i++)
ans=max(ans,e[n][i]);
printf("%d\n",ans);
}
return 0;
}