1. 用递归的方法来解决这个问题
2. 带记忆的递归(将那些已经计算过的点直接返回值)这里递归的时候,将那些计算过在它之下的最大路径的值保存起来,下次
再用的时候直接查看就可以了
#include<iostream>
#include <vector>
#include <string>
using namespace std;
#define MAXLINE 100
int vec[MAXLINE][MAXLINE];
int maxsum[MAXLINE][MAXLINE];
int ifmaxsum[MAXLINE][MAXLINE];
#define N 4
int max_sum(int a,int b)
{
if(a>=b)
return a;
else
return b;
}
int big_sum(int i,int j)
{
if(i==N)
return vec[i][j];
return max_sum(big_sum(i+1,j),big_sum(i+1,j+1))+vec[i][j];
}
//2. 带记忆的递归(将那些已经计算过的点直接返回值)
//这里递归的时候,将那些计算过在它之下的最大路径的值保存起来,下次
//再用刀的时候直接查看就可以了。
int big_sum1(int i,int j)
{
if(ifmaxsum[i][j]==-1)
return maxsum[i][j];
if(i==N)
return vec[i][j];
else
{
int x,y;
x=big_sum1(i+1,j);
y=big_sum1(i+1,j+1);
maxsum[i][j]=max_sum(x,y)+vec[i][j];
ifmaxsum[i][j]=-1;
return maxsum[i][j];
}
}
int main()
{
vec[0][0]=7;
vec[1][0]=3,vec[1][1]=8;
vec[2][0]=8,vec[2][1]=1;vec[2][2]=0;
vec[3][0]=2,vec[3][1]=7,vec[3][2]=4,vec[3][3]=4;
vec[4][0]=4,vec[4][1]=5,vec[4][2]=2,vec[4][3]=6,vec[4][4]=5;
cout<<big_sum(0,0)<<endl;
cout<<big_sum1(0,0)<<endl;
}
3. 从最下面的一行开始往上面求最大值,这样可以一直往上面递推来求最大路径值
4. 空间的优化,没一行求完之后就没有用了,可以只用一行数组
#include<iostream>
#include <vector>
#include <string>
#include <math.h>
using namespace std;
#define MAXLINE 100
int vec[MAXLINE][MAXLINE];
//从最下面的一行开始往上面求最大值,这样可以一直往上面递推来求最大路径值
int DiTui(int vec[][MAXLINE],int n)
{
int temp[MAXLINE][MAXLINE];
if(n==1)
return vec[0][0];
for(int j=0;j<=n-1;j++)
temp[n-1][j]=vec[n-1][j];
for(int i=n-2;i>0;i--)
for(int j=0;j<=i;j++)
temp[i][j]=max(temp[i+1][j],temp[i+1][j+1])+vec[i][j];
return vec[0][0]+max(temp[1][0],temp[1][1]);
}
//空间的优化,没一行求完之后就没有用了,可以只用一行数组
int DiTui1(int vec[][MAXLINE],int n)
{
int temp[MAXLINE];
if(n==1)
return vec[0][0];
for(int j=0;j<=n-1;j++)
temp[j]=vec[n-1][j];
for(int i=n-2;i>0;i--)
for(int j=0;j<=i;j++)
temp[j]=max(temp[j],temp[j+1])+vec[i][j];
return vec[0][0]+max(temp[0],temp[1]);
}
int main()
{
vec[0][0]=7;
vec[1][0]=3,vec[1][1]=8;
vec[2][0]=8,vec[2][1]=1;vec[2][2]=0;
vec[3][0]=2,vec[3][1]=7,vec[3][2]=4,vec[3][3]=4;
vec[4][0]=4,vec[4][1]=5,vec[4][2]=2,vec[4][3]=6,vec[4][4]=5;
cout<<DiTui(vec,5)<<endl;
cout<<DiTui(vec,5)<<endl;
}