菜鸟学习ACM,纪录自己成长过程中的点滴。
学习的路上,与君共勉。
ACM学习-POJ-1163-The Triangle
The Triangle
Description 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 (Figure 1) Input
Your program is to read from standard input. The first line contains one integer N: the number of rows in the triangle. The following N lines describe the data of the triangle. The number of rows in the triangle is > 1 but <= 100. The numbers in the triangle, all integers, are between 0 and 99.
Output
Your program is to write to standard output. The highest sum is written as an integer.
Sample Input 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 Sample Output 30 Source |
题目要求:
输入一个n层的三角形,第i层有i个数,求从第1层到第n层的所有路线中,权值之和最大的路线。
规定:第i层的某个数只能连线走到第i+1层中与它位置相邻的两个数中的一个。
题目分析:
典型的动态规划。
因此我们可以从下往上推,相邻的两个数中找较大的与上层相加,得出的结果相邻的两个数中再找较大的与上层相加,以此类推。用二维数组arr_[][]记录从下到该点的最大值。
核心代码
arr_[i][j] += arr_[i+1][j] > arr_[i+1][j+1] ? arr_[i+1][j] : arr_[i+1][j+1];
最后的结果就是arr_[0][0]。
下面给出AC代码。
#include <stdio.h>
#define MAXSIZE 105
int main()
{
int n;
int i, j;
int arr_[MAXSIZE][MAXSIZE];
while (~scanf("%d", &n))
{
for (i=0; i<n; i++)
{
for (j=0; j<=i; j++)
{
scanf("%d", &arr_[i][j]);
}
}
for (i=n-2; i>=0; i--)
{
for (j=0; j<=i; j++)
{
arr_[i][j] += arr_[i+1][j] > arr_[i+1][j+1] ? arr_[i+1][j] : arr_[i+1][j+1];
}
}
printf("%d", arr_[0][0]);
}
return 0;
}