题意:从三角形中选择从顶到底走的数字最大的路径输出结果
分析:1、动态规划递归问题,每个数字都等于他自己加上下方或右下方最长的路,最后一行直接为自身的值,递归向上
将输入存入二维数组中,(i,j)代表第i行j列的数
但是要注意将每个节点的最大路径存起来,这样第二次访问时就不用再求一遍,直接使用,不然会超时
2、递推问题,从最后一行向上递推求解
#include <stdio.h>
#include <iostream>
//http://bailian.openjudge.cn/practice/1163/
using namespace std;
int sum[105][105];
int init[105][105];
int m;
int maxsum(int x,int y){//递归求解
if(sum[x][y]!=-1)return sum[x][y];
if(x==m)return init[x][y];
sum[x][y]=+init[x][y]+max(maxsum(x+1,y),maxsum(x+1,y+1));
return sum[x][y];
}
int main(){
cin>>m;
for(int i=1;i<=m;i++){
for(int j=1;j<=i;j++){
cin>>init[i][j];
sum[i][j]=-1;
}
}
for(int i=1;i<=m;i++)sum[m][i]=init[m][i];//递推求解
for(int i=m-1;i>=1;i--){
for(int j=1;j<=i;j++){
sum[i][j]=max(sum[i+1][j],sum[i+1][j+1])+init[i][j];
}
}
cout<<sum[1][1]<<endl;
// cout<<maxsum(1,1)<<endl;
}