递归,递推,记忆化搜索,空间优化(数字三角形)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递归,递推,记忆化搜索,空间优化(数字三角形)相关的知识,希望对你有一定的参考价值。

题目链接:http://poj.org/problem?id=1163

1、递归思想:第一层到最底层的最优路径可以分解为:第一层到第二层来,再加上第二层的最优路径

状态: Time Limit Exceeded

#include <algorithm>
#include <stdio.h>
#define MAX 101

using namespace std;

int maps[MAX][MAX];
int n;
int Sum(int i,int j)
{
    if(i==n)
        return maps[i][j];
    else return max(Sum(i+1,j),Sum(i+1,j+1))+maps[i][j];
}

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=i;j++)
        {
            scanf("%d",&maps[i][j]);
        }
    }
    printf("%d\n",Sum(1,1));
    return 0;
}

2、通过记录表记录每一个点的最优解,从而避免重复计算。

Memory: 332KTime: 0MSLanguage: C++Result: Accepted

 

#include <iostream>
#include <algorithm>

using namespace std;

const int maxn=105;
int n;
int maps[maxn][maxn];
int maxsum[maxn][maxn];

int Maxsum(int i,int j)
{
    int x,y;
    if(maxsum[i][j]!=-1)
        return maxsum[i][j];
    if(i==n)
        return maps[i][j];
    x=Maxsum(i+1,j);
    y=Maxsum(i+1,j+1);
    maxsum[i][j]=max(x,y)+maps[i][j];
    return maxsum[i][j];
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=i;j++)
        {
            cin>>maps[i][j];
            maxsum[i][j]=-1;
        }
    }
    cout<<Maxsum(1,1)<<endl;
    return 0;
}

 

3、递归变递推

Memory: 332KTime: 0MSLanguage: C++Result: Accepted

 

#include <iostream>
#include <algorithm>

using namespace std;

const int maxn=105;
int n;
int maps[maxn][maxn];
int maxsum[maxn][maxn];

int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=i;j++)
        {
            cin>>maps[i][j];
        }
    }
    for(int i=1;i<=n;i++)
        maxsum[n][i]=maps[n][i];
    for(int i=n-1;i>=1;i--)
    {
        for(int j=1;j<=i;j++)
        {
            maxsum[i][j]=max(maxsum[i+1][j],maxsum[i+1][j+1])+maps[i][j];
        }
    }
    cout<<maxsum[1][1]<<endl;
    return 0;
}

 

4、空间优化,不需要用到二维记录表。

Memory: 204KTime: 0MSLanguage: C++Result: Accepted

 

#include <stdio.h>
#include <algorithm>
#define MAX 101

using namespace std;

int maps[MAX][MAX];
int sum[MAX];

int main()
{
     int n;
     scanf("%d",&n);
     for(int i=1;i<=n;i++)
     {
         for(int j=1;j<=i;j++)
            scanf("%d",&maps[i][j]);
     }
     for(int i=1;i<=n;i++)
        sum[i]=maps[n][i];
     for(int i=n-1;i>=1;i--)
     {
         for(int j=1;j<=i;j++)
            sum[j]=max(sum[j],sum[j+1])+maps[i][j];
     }
     printf("%d\n",sum[1]);
}

 

 

 

 

 

 

 

 

以上是关于递归,递推,记忆化搜索,空间优化(数字三角形)的主要内容,如果未能解决你的问题,请参考以下文章

洛谷 P1464 Function动态规划(递推)/记忆化搜索(递归)

动态规划基础

动态规划-记忆化搜索

[每日一题2020.06.14]leetcode #70 爬楼梯 斐波那契数列 记忆化搜索 递推通项公式

紫书第9章 动态规划初步

数字三角形