Consider the number triangle shown below. Write a program that calculates the highest sum of numbers that can be passed on a route that starts at the top and ends somewhere on the base. Each step can go either diagonally down to the left or diagonally down to the right.
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
In the sample above, the route from 7 to 3 to 8 to 7 to 5 produces the highest sum: 30.
INPUT FORMAT
The first line contains R (1 <= R <= 1000), the number of rows. Each subsequent line contains the integers for that particular row of the triangle. All the supplied integers are non-negative and no larger than 100.There are multiple testcases, process to the end of file.
SAMPLE INPUT 5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
OUTPUT FORMAT
A single line containing the largest sum using the traversal specified. SAMPLE OUTPUT 30
简单dp。
具体实现如下:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 1002
#define Max(a,b) ((a)>(b)?(a):(b))
int read[N][N] ,dp[N][N];
void ReadData(int n)
{
memset(read, 0, sizeof(read));
int i, j;
for (i = 0; i < n; i++)
{
for (j = 0; j <= i; j++)
{
scanf("%d", &read[i][j]);
}
}
}
void solve(int n)
{
memset(dp, 0, sizeof(dp));
int i, j,T=0;
dp[0][1] = read[0][0];
for (i = 1; i < n; i++)
{
for (j = 1; j <= i + 1; j++)
{
dp[i][j] = Max(dp[i - 1][j - 1], dp[i - 1][j]) + read[i][j - 1];
T = Max(dp[i][j], T);
}
}
printf("%d\n", T);
}
int main()
{
int n;
while (scanf("%d", &n) != EOF)
{
ReadData(n);
solve(n);
}
return 0;
}