首先是递归程序
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long ll;
int n;
int a[101][101];
int maxsum(int i,int j){
if(i==n){
return a[i][j];
}
int x=maxsum(i+1,j);
int y=maxsum(i+1,j+1);
return max(x,y)+a[i][j];
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
scanf("%d",&a[i][j]);
}
}
cout<<maxsum(1,1)<<endl;
return 0;
}
其次是记忆化搜索程序
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long ll;
int n;
int a[101][101];
int dp[101][101];
int maxsum(int i,int j){
if(dp[i][j]!=-1){
return dp[i][j];
}
if(i==n){
dp[i][j] = a[i][j];
}
int x=maxsum(i+1,j);
int y=maxsum(i+1,j+1);
dp[i][j]=max(x,y)+a[i][j];
return dp[i][j];
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
scanf("%d",&a[i][j]);
dp[i][j]=-1;
}
}
cout<<maxsum(1,1)<<endl;
return 0;
}
二维递推
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long ll;
int a[101][101];
int dp[101][101];
int n;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++){
dp[n][i]=a[n][i];
}
for(int i=n-1;i>=1;i--){
for(int j=1;j<=i;j++){
dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+a[i][j];
}
}
cout<<dp[1][1]<<endl;
return 0;
}
一维递推
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long ll;
int a[101][101];
int dp[101];
int n;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++)
dp[n]=a[n][i];
for(int i=n-1;i>=1;i--){
for(int j=1;j<=i;j++){
dp[j]=max(dp[j],dp[j+1])+a[i][j];
}
}
cout<<dp[1]<<endl;
return 0;
}