题意:给你一个数字三角形,从上往下走。每次只能直接往左下或者右下走,求从最上面走到最下面数字的最大和。
思路:动态规划,设dp[i][j]为从最高点到点(i,j)的最大和,那么dp[i][j]=max(dp[i+1][j+1],dp[i+1][j])+number[i][j]。即每次都取最大的一个,那么直接从最后一层往上推即可。
#include<stdio.h>
int max(int x,int y)
{
if(x>y)
return x;
return y;
}
int main()
{
int n,i,j,k;
int number[110][100],dp[110][110];
scanf("%d",&n);
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
scanf("%d",&number[i][j]);
for(i=1;i<=n;i++)
dp[n][i]=number[n][i];
for(i=n-1;i>=1;i--)
for(j=1;j<=i;j++)
dp[i][j]=number[i][j]+max(dp[i+1][j],dp[i+1][j+1]);
printf("%d\n",dp[1][1]);
return 0;
}