题目
代码
解法1
将每一次计算过的最大值存至数组maxSum中,避免重复计算,提高效率
#include<iostream>
#include<algorithm>
using namespace std;
#define MAX 101
int D[MAX][MAX];
int n;
int maxSum[MAX][MAX];
int MaxSum(int i,int j){
if(maxSum[i][j]!=-1){
return maxSum[i][j];
}
if(i == n){
maxSum[i][j] = D[i][j];
}
else{
int x = MaxSum(i+1,j);
int y = MaxSum(i+1,j+1);
maxSum[i][j] = max(x,y)+D[i][j];
}
return maxSum[i][j];
}
int main(){
cin >> n;
int i,j;
for(i = 1;i<=n;i++){
for(j=1;j<=i;j++){
cin >> D[i][j];
maxSum[i][j] = -1;
}
}
cout <<MaxSum(1,1)<<endl;
}
解法2
使用将递归转化成递推,并只用一行数组存储最大值,时间和空间都较第一种方法更优。
#include<iostream>
#include<algorithm>
using namespace std;
#define MAX 101
int D[MAX][MAX];
int n;
int * maxSum;
int main(){
cin >> n;
int i,j;
for(i = 1;i<=n;i++){
for(j = 1;j<=i;j++){
cin >> D[i][j];
}
}
maxSum = D[n];
for(i = n-1;i>=1;--i){
for(j = 1;j<=n;j++){
maxSum[j] = max(maxSum[j],maxSum[j+1]) + D[i][j];
}
}
cout << maxSum[1]<<endl;
}