0
点赞
收藏
分享

微信扫一扫

记忆递归动态规划

ixiaoyang8 2022-02-26 阅读 86

例题 POJ 1163

1163 -- The Triangle

方法一 :递归(耗时

#include<iostream>
#include<algorithm>
using namespace std;
#define MAX 101
const int N=1e7+10;
int MAXsum(int i,int j);
int n;int a[MAX][MAX];
int main()
{
	cin>>n;
	int i,j;
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=i;j++)
		{
			cin>>a[i][j];
		}
	}
	cout<<MAXsum(1,1);
	return 0;
}

int MAXsum(int i,int j)
{
	if(i==n)
	return a[i][j];
	else
	{
		int x=MAXsum(i+1,j);
		int y=MAXsum(i+1,j+1);
	 return max(x,y)+a[i][j];
	}
}

方法二:记忆递归

方法一之所以耗时是因为递归出现了重复调用,计算。导致效率低下。所以我们采用一种办法,就是计算过的位置不再计算,将其记住,需要的时候直接调用。

这里使用一个maxsum数组来记录每次计算的结果

#include<iostream>
#include<algorithm>
using namespace std;
#define MAX 101
const int N=1e7+10;
int MAXsum(int i,int j);
int n;int a[MAX][MAX];
int maxsum[MAX][MAX];
int main()
{
	cin>>n;
	int i,j;
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=i;j++)
		{
			cin>>a[i][j];
			maxsum[i][j]=-1;//-1代表还没计算
		}
	}
	cout<<MAXsum(1,1);
	return 0;
}

int MAXsum(int i,int j)
{
	if(maxsum[i][j]!=-1)//检测到不等于-1说明该位置计算过了
	return maxsum[i][j];
	else if(i==n)
	maxsum[i][j]= a[i][j];
	else
	{
		int x=MAXsum(i+1,j);
		int y=MAXsum(i+1,j+1);
	    maxsum[i][j] = max(x,y)+a[i][j];
	}
	return maxsum[i][j];
}
举报

相关推荐

0 条评论