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
单纯的递归, 但是会超时
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 110
#define max(a,b) (a>b?a:b)
int a[N][N];
int DFS(int x, int y, int n)
{
if(x>n || y>n)
return 0;
if(x==n && y==n)
return a[x][y];
return a[x][y]+ max(DFS(x+1,y, n), DFS(x+1, y+1, n));
}
int main()
{
int n;
while(scanf("%d", &n)!=EOF)
{
int i, j;
memset(a, 0, sizeof(a));
for(i=1; i<=n; i++)
for(j=1; j<=i; j++)
scanf("%d", &a[i][j]);
printf("%d\n", DFS(1,1,n));
}
return 0;
}
用上记忆化搜索后, 不会超时了
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 110
#define max(a,b) (a>b?a:b)
int a[N][N], dp[N][N];
int DFS(int x, int y, int n)
{
if(x>n || y>n)
return 0;
if(dp[x][y]!=-1)
return dp[x][y];
else
{
if(x==n && y==n)
return a[x][y];
dp[x+1][y] = DFS(x+1, y, n);
dp[x+1][y+1] = DFS(x+1, y+1, n);
return a[x][y]+ max(dp[x+1][y], dp[x+1][y+1]);
}
}
int main()
{
int n;
while(scanf("%d", &n)!=EOF)
{
int i, j;
memset(a, 0, sizeof(a));
memset(dp, -1, sizeof(dp));
for(i=1; i<=n; i++)
for(j=1; j<=i; j++)
scanf("%d", &a[i][j]);
printf("%d\n", DFS(1, 1, n));
}
return 0;
}
勿忘初心