0
点赞
收藏
分享

微信扫一扫

记忆递归动态规划

ixiaoyang8 2022-02-26 阅读 85

例题 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 条评论