zoukankan      html  css  js  c++  java
  • 洛谷P1216数塔(逆向递推递归+记忆化,dp)

    题目链接:https://www.luogu.org/problemnew/show/P1216

    题目很简单,是dp和记忆化搜索的入门练手好题

    有一个坑点,全为0的时候,记忆化没初始化为其它值的话,还是暴力递归绝对超时。。(所以记忆化时,根据题目要求分析,一般都初始化为-1)

     1 #include <iostream>
     2 #include <string>
     3 #include <algorithm>
     4 #include <cstdio>
     5 #include <cstring>
     6 #include <cmath>
     7 using namespace std;
     8 typedef long long ll;
     9 typedef unsigned long long ull;
    10 const int maxn=1005;
    11 int a[maxn][maxn];
    12 int f[maxn][maxn];
    13 int vis[maxn];
    14 int R;
    15 
    16 int so(int x,int y)
    17 {
    18     if(f[x][y]!=-1) return f[x][y];//必须!=-1,!=0的话还是万一都为0还是没记忆化到Tle
    19     if(x==R)
    20     {
    21         return f[x][y]=a[x][y];
    22     }
    23 
    24     int l=y,r=y+1;
    25     int ls=a[x][y],rs=a[x][y],ans=a[x][y];
    26     if(l>=1) ls+=so(x+1,l);
    27     if(r<=R) rs+=so(x+1,r);
    28 
    29     ans=max(ans,ls);
    30     ans=max(ans,rs);
    31     f[x][y]=max(f[x][y],ans);
    32     return f[x][y];
    33 }
    34 
    35 int main()
    36 {
    37     ios::sync_with_stdio(false); cin.tie(0);
    38 
    39     cin>>R;
    40     for(int i=1;i<=R;i++)
    41     {
    42         for(int j=1;j<=i;j++)
    43         {
    44             cin>>a[i][j];
    45             f[i][j]=-1;
    46         }
    47     }
    48 
    49     int ans=so(1,1);
    50 
    51     cout<<ans<<endl;
    52 
    53     return 0;
    54 }

    完。

  • 相关阅读:
    数组指针和指针数组的区别
    C++虚函数
    C++容器
    红黑树
    COM RTS/CTS, DTR/DSR
    linux和windows多线程的异同
    socket
    C++vector使用
    select函数详解
    linux下头文件
  • 原文地址:https://www.cnblogs.com/redblackk/p/9822255.html
Copyright © 2011-2022 走看看