OVSolitario-io

导航

DP题单练习

P1091 [NOIP 2004 提高组] 合唱队形:P1091 [NOIP 2004 提高组] 合唱队形
思路:以dp[i]为结尾的上升子序列和以dp[i]开头的最长下降子序列,再进行求和即可

P1164 小A点菜:P1164 小A点菜
思路:dp[i]为刚好花i元的方案数

花光n元的方案数,对于恰好n元那么一定有第k步选了ik,那么问题变为n-k元方案数,即n方案数 = n-k元的方案数 + ik,转移方程:f[n] = f[n - k];,凑0元方案数= 1

P1077 [NOIP 2012 普及组] 摆花:P1077 [NOIP 2012 普及组] 摆花
思路:dp[i][j]为从前i种花选j种的方案数

问从前i种花中求选j盆的方案数,即枚举第i种花选了多少种,当第i种花选了k盆,那么问题则变为了从前i-1种花选j-k盆的方案数,转移方程dp[i][j] = max(dp[i][j], dp[i - 1][j - k]),任意种花凑0盆方案数=1

裸dp[0][0] = 1时,更新j要从0开始来使得每层dp[i][0] = 1

P1434滑雪:记忆化 + 判空搜索滑雪
思路: dp[i][j]为(i,j)的最大滑雪距离,由于无法排出i,j点为最大滑雪路径,所以枚举all(i,j),那么有当(x,y)是一个路径的一个点,那么它肯定不是最大距离(最大路径是它的祖宗),转移方程dp(i, j) = max(dp[i][j], dp[x][y] + 1);

当这个点无法移动时,它的max距离 = 1

纸币问题1:预处理 + 完全背包
思路:dp[j]为凑j元需要的最小纸币
P2842 纸币问题 1

其中为了min进行,将all初始化为INF较大值

纸币问题2:记忆化搜索P2840 纸币问题 2

nt dfs(int sum) {
    if(dp[sum] != -1) return dp[sum];
    if(sum == 0) {
        return 1;
    }
    long long res = 0;//long long防止溢出
    for(int i = 1; i <= n; ++ i) {
        if(sum >= a[i]) {
            res += dfs(sum - a[i]) % mod;
            res %= mod;
        }
    }
    return dp[sum] = res;
}

线段:P3842 [TJOI2007] 线段

编辑距离 编辑距离
考虑将A变为B,显然只有lenA!=lenB才执行删除插入,其余修改即可,那么对于i-1,j-1相等,转移到i,j不需要花费,然后初始化出i,j为0的情况

P6208 [USACO06OCT] Cow Pie Treasures :分组背包Ghttps://www.luogu.com.cn/problem/P6208

posted on 2025-08-29 14:49  TBeauty  阅读(4)  评论(0)    收藏  举报