题意:一个数字三角形,第i行有i个数,从每个数可以移动到左下方或又下方,求从顶层到底层的所有路径中,最大的数字和
思路:状态:d[i,j]表示点(i,j)到底层的数字和,转移方程:d[i,j] = max(d[i+1,j],d[i+1,j+1]) + num[i][j](num[i][j]为点(i,j)的数字)
#include<iostream>
using namespace std;
#define max(a,b) ((a)>(b)?(a):(b))
int main()
{
int num[101][101],dp[101][101];
int n,i,j;
scanf("%d",&n);
for(i = 0;i < n;i++)
for(j = 0;j <= i;j++)
scanf("%d",&num[i][j]);
for(i = 0;i < n;i++)
dp[n-1][i] = num[n-1][i];
for(i = n-2;i >= 0;i--)
for(j = 0;j <= i;j++)
dp[i][j] = num[i][j] + max(dp[i+1][j],dp[i+1][j+1]);
printf("%d\n",dp[0][0]);
return 0;
}