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; }
时间: 2024-10-07 11:48:04