洛谷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 }

 

完。

posted @ 2018-10-20 16:55  RedBlack  阅读(328)  评论(0编辑  收藏  举报