1 条题解

  • 1
    @ 2025-10-22 18:47:08

    众所周知,一旦 OJ 检测到你在名为 A+B Problem 的题里提交含有 cout<<a+b 之类的代码,就会判你 UKE。对于这样一道黑题,我们急需一篇大炮(核弹)轰蚊子的题解。
    观察大炮这个词语,注意到它的首字母为 dp,而鱼谷题库中有“动态规划”分类,这启示我们用动态规划解决这道题。 ——改编自洛谷 P1001 的一篇题解。
    我们很容易设计本题的状态转移方程
    定义 dp[i]dp[i] 为 “累加 ii11 的结果”,通过 dp[i]=dp[i1]+1dp[i] = dp[i-1] + 1 递推,最终 dp[A+B]dp[A+B] 即为答案。
    按照这个思路,我们就能愉快地拿下 AC\green{AC} 了。

    #include<bits/stdc++.h>
    
    using namespace std;
    
    int dp(int a, int b) {
        int target = a + b;
        if (target == 0) return 0;
        unordered_map<int, int> dp;
        dp[0] = 0;
    
        if (target > 0) {
            // 目标为正数:从0递推到target(每次+1)
            for (int i = 1; i <= target; ++i) {
                dp[i] = dp[i - 1] + 1;
            }
        } else {
            // 目标为负数:从0递推到target(每次-1)
            for (int i = -1; i >= target; --i) {
                dp[i] = dp[i + 1] - 1;
            }
        }
        return dp[target];
    }
    
    
    int main() {
        int a,b;
    	cin>>a>>b;
    	cout<<dp(a,b);
    
        return 0;
    }
    

    我们成功的将一个 O(1)O(1) 的程序优化到了 O(n)O(n)!!!
    思维拓展:尝试以 O(logn)O(\log n) 的做法通过此题!
    注:如果有空,还会更新使用图论、C++ 自编 Brainf**k 解释器等方案的题解。

    信息

    ID
    244
    时间
    1000ms
    内存
    256MiB
    难度
    1
    标签
    递交数
    17
    已通过
    7
    上传者