深入DP!!!!!!!!!!!!!!-----------------------“DP就像人生:你的当前状态由过去的选择决定,而你的选择将影响未来状态。定义好你的状态转移方程,找到最优的人生路径!“

 "动态规划不是魔法,而是将大问题拆解成小问题的艺术"
—— 一位ACMer的深夜顿悟

  暑假集训我们过关斩将,来到了线性动态规划和前缀优化这里,不好,是让人心惊胆战的DP!!!不同于其他题解,我们在详说DP之前,我们先说说记忆化搜索。
  

什么是记忆化搜索?
记忆化搜索(Memoization)是一种优化递归算法的技术,通过存储已计算的子问题结果,避免重复计算。它是自顶向下的动态规划实现方式。

模板题 斐波那契数列
问题描述
计算第n个斐波那契数:

F(0) = 0

F(1) = 1

F(n) = F(n-1) + F(n-2) (n≥2)

普通递归解法(低效)
int fib(int n){
    if(n<=1){
        return n;
    }
    return fib(n-1)+fib(n-2);
}
AI写代码
cpp
运行
时间复杂度:O(2^n)

记忆化搜索解法(高效)
int fib(int n){
    if(vis[n]!=-1){
        return vis[n]; 
    }
    if(n<=1){
        return vis[n]=n;
    }
    return vis[n]=(fib(n-1)+fib(n-2));
}
AI写代码
cpp
运行
时间复杂度:O(n)
空间复杂度:O(n)

记忆化搜索与动态规划的联系
本质联系:同一问题的两种视角
1. 核心思想相同
共同目标:解决具有重叠子问题和最优子结构的问题

核心策略:通过存储子问题解避免重复计算

2. 状态定义一致
无论是记忆化搜索还是动态规划,都需要明确定义状态。例如在斐波那契数列问题中:

状态定义:dp[n]表示第n个斐波那契数

状态转移:dp[n] = dp[n-1] + dp[n-2]

二者刚好相反,DP初始化是记忆化搜索的终点,递归就是状态转移方程。

DP如果T了,就可使用前缀和优化。

你可能感兴趣的:(算法)