zoukankan      html  css  js  c++  java
  • 递归,递推,记忆化搜索,空间优化(数字三角形)

    题目链接: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]);
    }

     

     

     

  • 相关阅读:
    谁说固态硬盘没容量?4TB诞生、明年8TB!
    微软.NET Framework 4.5.2 RTM正式版
    Chrome 应用推荐
    MS14-021: Internet Explorer 安全更新: 2014 年 5 月 1 日
    百视通与微软共同宣布9月在华发布Xbox One
    支付宝5月4日起将停止收款主页业务 保留三种收款方式
    Chrome 应用推荐
    为什么《舌尖上的中国》让你欲罢不能?
    求连续子数组的最大乘积
    损失函数与代价函数区别
  • 原文地址:https://www.cnblogs.com/TreeDream/p/5204194.html
Copyright © 2011-2022 走看看