找一个sum数组把已经求出最大和记录下来。
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int a[105][105];
int n;
int maxsum[105][105];
int MaxSum(int i,int j){
if(maxsum[i][j]!=-1)//说明前面已经算出来a[i][j]到最后一行的最大距离
return maxsum[i][j];
if(i==n)
maxsum[i][j]=a[i][j];
else{
int x=MaxSum(i+1,j);
int y=MaxSum(i+1,j+1);
maxsum[i][j]=max(x,y)+a[i][j];
}
return maxsum[i][j];
}
int main(){
int i,j;
cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=i;j++){
cin>>a[i][j];
maxsum[i][j]=-1;
}
cout<<MaxSum(1,1)<<endl;
return 0;
}
或者用递推循环:
从最底层的往上推:
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int a[105][105];
int n;
int sum[105][105];
int main(){
int i,j;
cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
cin>>a[i][j];
for(j=1;j<=n;j++)
sum[n][j]=a[n][j];
for(i=n-1;i>0;i--)
for(j=1;j<=i;j++)
sum[i][j]=a[i][j]+max(sum[i+1][j],sum[i+1][j+1]);
printf("%d\n",sum[1][1]);
return 0;
}
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int a[105][105];
int n;
int *maxsum;
int main(){
int i,j;
cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
cin>>a[i][j];
maxsum=a[n];//maxsum指向第n行
for(int i=n-1;i>=1;i--)
for(int j=1;j<=i;++j)
maxsum[j]=max(maxsum[j],maxsum[j+1])+a[i][j];
cout<<maxsum[1]<<endl;
return 0;
}