这是一道很简单的动态规划的题目,就是求三角形从上至下的一条最长路径之和,每次都只能选择自己右下或者左下的两个点来走
刚开始输入一个N 表示是一个直角边长为 N的三角形
要求第一行到最底下的最长路径,就得知道从第二行到最底下的最长路径,故依次类推,推导到最后一行,实际上就成了一个递归
当在最后一行的时候就是maxsum[i][j]=D[i][j],其余的则是maxsum[i][j] =max(maxsum[i+1][j],maxsum[i+1][j+1])+D[i][j]
实际上这样还是太浪费空间,如果不用二维数组,我直接用一个一维数组来保存没行的最大值maxsum[j]=max(maxsum[j],maxsum[j+1])+D[i][j]
最后输出的值为maxsum[1] .
输入
5
7
3 8
8 1 0
2 7 4 4
45265
输出
刚开始输入一个N 表示是一个直角边长为 N的三角形
要求第一行到最底下的最长路径,就得知道从第二行到最底下的最长路径,故依次类推,推导到最后一行,实际上就成了一个递归
当在最后一行的时候就是maxsum[i][j]=D[i][j],其余的则是maxsum[i][j] =max(maxsum[i+1][j],maxsum[i+1][j+1])+D[i][j]
实际上这样还是太浪费空间,如果不用二维数组,我直接用一个一维数组来保存没行的最大值maxsum[j]=max(maxsum[j],maxsum[j+1])+D[i][j]
最后输出的值为maxsum[1] .
输入
5
7
3 8
8 1 0
2 7 4 4
45265
输出
30
#include<stdio.h>
const int max=101;
int MAX(int a,int b )
{
return a>b?a:b;
}
int main()
{
int d[max][max],n;
int *maxsum;
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
scanf("%d",&d[i][j]);
maxsum=d[n];
for(int i=n-1;i>=1;i--)
for(int j=1;j<=i;j++)
maxsum[j]=MAX(maxsum[j],maxsum[j+1])+d[i][j];
printf("%d\n",maxsum[1]);
return 0;
}