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

 

完。

转载于:https://www.cnblogs.com/redblackk/p/9822255.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
洛谷 p1464 是一道经典的动态规划问题,也被称为函数的图解问题。这道题的题目描述如下: 给定一个整数函数 f(x),其中 x 是一个非负整数。函数满足以下性质: 1. f(0) = 1 2. f(x) = f(x-1) + f(x/2) + f(x/3),其中 x > 0 且 x 可以整除 2 或 3。 题目要求计算 f(x) 的值,给定的 x 是一个非负整数。 解题思路是使用动态规划来求解。我们可以定义一个数组 dp,其中 dp[i] 表示 f(i) 的值。根据题目给出的性质,可以得到递推关系式: dp[i] = dp[i-1] + dp[i/2] + dp[i/3] 在实际求解中,我们从小到大计算 dp[i] 的值,直到计算到 dp[x] 的值为止。最终得到的 dp[x] 即为所求函数值。 以下是对于 x = 10 的计算过程示例: 1. 初始 dp 数组:dp = 1。 2. 计算 dpdp = dp + dp + dp = 1 + 1 + 1 = 3。 3. 计算 dpdp = dp + dp + dp[0] = 3 + 3 + 1 = 7。 4. 计算 dpdp = dp + dp + dp[1] = 7 + 3 + 3 = 13。 5. 计算 dpdp = dp + dp + dp[1] = 13 + 7 + 3 = 23。 6. 计算 dpdp = dp + dp + dp[1] = 23 + 7 + 3 = 33。 7. 计算 dpdp = dp + dp + dp = 33 + 13 + 7 = 53。 8. 计算 dpdp = dp + dp + dp = 53 + 13 + 7 = 73。 9. 计算 dpdp = dp + dp + dp = 73 + 23 + 13 = 109。 10. 计算 dpdp = dp + dp + dp = 109 + 23 + 13 = 145。 11. 计算 dp[10]:dp[10] = dp + dp + dp = 145 + 33 + 23 = 201。 所以,f(10) 的值为 201。 这就是洛谷 p1464 function图解的解题思路和计算过程。希望能对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值