动态规划数字三角形
https://blog.csdn.net/ailaojie/article/details/83014821
//动态规划数字三角形
#include<iostream>
using namespace std;
/*
4
7 3 8 8 1 0 2 7 4 4
7
3 8
8 1 0
2 7 4 4
*/
//int MAX = 101;
int D[101][101]={};
int n;
int maxSum[101][101];//从Dij到底边的各条路径最大数字之和
int MaxSum(int i, int j){//从Dij到底边的各条路径最大数字之和
if(maxSum[i][j]!=-1) {//当不是第一次计算,maxSum取原先计算的
cout<<"calculated maxSum["<<i<<"]["<<j<<"]="<<maxSum[i][j]<<endl;
return maxSum[i][j];//
}
if(i == n){//当是最后一行
maxSum[i][j]=D[i][j];
cout<<"lastline maxSum["<<i<<"]["<<j<<"]="<<maxSum[i][j]<<endl;
}
else{
int x = MaxSum(i+1,j);
int y = MaxSum(i+1,j+1);
maxSum[i][j]=max(x,y)+D[i][j];
cout<<"maxSum["<<i<<"]["<<j<<"]="<<maxSum[i][j]<<endl;
}
return maxSum[i][j];
}
int main(){
//int n=4;
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
cin>>D[i][j];
cout<<"insert D["<<i<<"]"<<"["<<j<<"]: "<<D[i][j]<<endl;
maxSum[i][j]=-1;//初始全-1
}
}
cout<<"MaxSum(1,1):"<<MaxSum(1,1)<<endl;
return 0;
}
//动态规划数字三角形
#include<iostream>
using namespace std;
int D[101][101]={};
int n;
int *maxSum;
int main(){
//int n=4;
cin>>n;
int i,j;
for(i=1;i<=n;i++){
for(j=1;j<=i;j++){
cin>>D[i][j];
cout<<"insert D["<<i<<"]"<<"["<<j<<"]: "<<D[i][j]<<endl;
}
}
maxSum=D[n];//初始
cout<<maxSum[1]<<maxSum[2]<<maxSum[3]<<maxSum[4]<<endl;
for(i=n-1;i>=1;i--){
for(j=1;j<=i;j++){
cout<<"i:"<<i<<" j:"<<j<<endl;
cout<<maxSum[j]<<"or"<<maxSum[j+1]<<"+"<<D[i][j]<<endl;
maxSum[j]=max(maxSum[j],maxSum[j+1])+D[i][j];
cout<<"maxSum[j]:"<<maxSum[j]<<'\n'<<endl;
}
}
cout<<"maxSum[1]:"<<maxSum[1]<<endl;
return 0;
}