码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-05-18 22:25:34      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:

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;
}

  

 

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

标签:

原文地址:http://www.cnblogs.com/yanliang12138/p/4513007.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!