三角形问题——(递归,递推,动态规划)

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;

}

  

 

你可能感兴趣的:(动态规划)