将待求解问题分解成若干个子问题
经典三角问题
#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
#define MAXM 1010
using namespace std;
int n;
int arr[MAXM][MAXM];
int maxsum[MAXM][MAXM];//记忆数组
int Maxsum(int i,int j) {
if(maxsum[i][j]!=-1)
return maxsum[i][j];
if(i==n)
return arr[i][j];
else {
int x=Maxsum(i+1,j);
int y=Maxsum(i+1,j+1);
//return arr[i][j]+max(x,y);
maxsum[i][j]=arr[i][j]+max(x,y);
}
}
int main(void) {
cin>>n;
for(int i=1; i<=n; i++) {
for(int j=1; j<=i; j++) {
cin>>arr[i][j];
maxsum[i][j]=-1;
}
}
cout<<Maxsum(1,1);
return 0;
}
由于递归会导致重复计算,使得时间复杂度变高,所以上面的记忆数组用来储存结果。
一般的递归都可以用数组,就是递推写出来
#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
#define MAXM 1010
using namespace std;
int n;
int arr[MAXM][MAXM];
int maxsum[MAXM][MAXM];//储存结果的数组
int main(void) {
cin>>n;
for(int i=1; i<=n; i++) {
for(int j=1; j<=i; j++) {
cin>>arr[i][j];
}
}
for(int i=1;i<=n;i++){
maxsum[n][i]=arr[n][i];//先使最后一行和三角的最后一行相同
}
for(int i=n-1;i>=1;--i){//从倒数第二行开始往下看
for(int j=1;j<=i;++j){
maxsum[i][j]=max(maxsum[i+1][j],maxsum[i+1][j+1])+arr[i][j];//选择下一行中左右较大的一个
}
}
cout<<maxsum[1][1]<<endl;//最顶上的数字就是最大的
return 0;
}
总结就是还是从下往上看