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


    题目链接: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
    ",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
    ",sum[1]);
    }

     

     

     

  • 相关阅读:
    linux中的等待队列
    MapReduce中的作业调度
    hdfs: 数据流(二)
    hdfs: 一个分布式文件系统(一)
    记住这一天
    Partitioning, Shuffle and sort
    从wordcount 开始 mapreduce (C++hadoop streaming模式)
    iOS9 请求出现App Transport Security has blocked a cleartext HTTP (http://)
    Xcode7 下iphone6、6s进行屏幕适配
    隐藏系统的uitabbar
  • 原文地址:https://www.cnblogs.com/TreeDream/p/5204194.html
Copyright © 2020-2023  润新知