题目链接: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 }
完。