zoukankan      html  css  js  c++  java
  • 洛谷CF1132F Clear the String 题解 区间DP

    题目链接:https://codeforces.com/problemset/problem/1132/F

    题目大意:

    给你一个串 (s),每次可以花费 (1) 的代价删去一个子串,要求子串的每一位为同一个字符。

    求删去整个串的最小代价。

    (1le |s|le 500)

    解题思路:

    区间DP。

    我们设 (f_{l,r}) 代表删除 (l)(r) 之间的所有字符的最小花费。

    那么有两种决策:

    1. 单独删掉开头的字符,则 (f_{l,r} = f_{l+1,r} + 1)
    2. 在串中找到一个与开头字符相同的位置一块删,我们枚举中间位置 (k) ,则有 (f_{l,r} = min (f_{l+1,k-1},f_{k,r}))

    示例代码:

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 505;
    int n;
    char s[maxn];
    int f[maxn][maxn];
    int dfs(int L, int R) {
        if (L > R) return 0;
        if (f[L][R] != -1) return f[L][R];
        f[L][R] = 1 + dfs(L+1, R);
        for (int k = L+1; k <= R; k ++)
            if (s[L] == s[k])
                f[L][R] = min(f[L][R], dfs(L+1, k-1) + dfs(k, R));
        return f[L][R];
    }
    int main() {
        memset(f, -1, sizeof(f));
        scanf("%d%s", &n, s);
        printf("%d
    ", dfs(0, n-1));
        return 0;
    }
    
  • 相关阅读:
    package.json文件
    Node.js中模块加载机制
    第三方模块
    系统模块
    Node.js快速入门及模块化开发
    String 的扩展方法
    ES6 的内置对象扩展
    箭头函数
    解构赋值
    let、const、var 的区别
  • 原文地址:https://www.cnblogs.com/quanjun/p/13753485.html
Copyright © 2011-2022 走看看