初学动态规划
塔形最大和
问题:
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
这是一个塔形数组,现在计算从塔顶向下加,但只能加下面和下有的数,直到最底层,求最大的和是多少。
input
5 //表示有几层
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
output
30
个人解析
一般刚上手会直接从第一层加取,但是由于不知道后面层数的数字,会造成只有当前一步加取最大,不可取,暴力求解也不可取,所以从最后一层看,4 5 2 6 5,倒数第二层2 7 4 4,其中倒数第二层中2可以选择4和5,但是明显选择5效益最大,所以把5加到2上去,变成7 7 4 4,以此类推,倒数第二层变为7 12 10 10,再按照此方法算,倒数第三曾得到20 13 10,直到加取到第一次为30,结束。
#include<iostream>
#include<string>
using namespace std;
#define MAX 101
int *maxsum;
int a[100][100];
int n;
int main()
{
int i,j;
cin>>n;
for(i=0;i<n;i++)
for(j=0;j<=i;j++)
{
cin>>a[i][j];
}
maxsum=a[n-1];
for(i=n-2;i>=0;i--)
for(j=0;j<=i;j++)
maxsum[j]=max(maxsum[j],maxsum[j+1])+a[i][j];
cout<<maxsum[0]<<endl;
return 0;
}