数字三角形问题
Description
定一个由n行数字组成的数字三角形如下图所示。试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大。
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
对于给定的由n行数字组成的数字三角形,计算从三角形的顶至底的路径经过的数字和的最大值。
Input
入数据的第1行是数字三角形的行数n,1≤n≤100。接下来n行是数字三角形各行中的数字。所有数字在0…99之间。
Output
输出数据只有一个整数,表示计算出的最大值。
Sample Input
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
Sample Output
30
动态规划问题
#include<iostream>
#include<cstdio>
#include<stdlib.h>
#include<cstring>
using namespace std;
#define INF 1000000
#define max(x,y) ((x)>(y)?(x):(y))
int dp[110][110];
int arr[110][110];
void fun(int n) // 初始化dp数组
{
memset(dp,0,sizeof(dp));
dp[0][0] = arr[0][0];
for(int i = 1;i<n;i++)
{
dp[i][0] = dp[i-1][0]+arr[i][0];
}
for(int i = 1;i<n;i++)
{
dp[i][i] = dp[i-1][i-1]+arr[i][i];
}
for(int i = 1;i<n;i++)
{
for(int j = 1;j<i;j++)
{
dp[i][j] = max(dp[i-1][j-1],dp[i-1][j])+arr[i][j];
}
}
}
int main()
{
int n;
cin>>n;
for(int i = 0;i<n;i++)
for(int j = 0;j<=i;j++)
cin>>arr[i][j];
fun(n);
int maxn = 0;
for(int j = 0;j<n;j++)
{
if(dp[n-1][j]>maxn)
maxn = dp[n-1][j];
}
cout<<maxn<<endl;
return 0;
}