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;
    }
    
  • 相关阅读:
    矩阵求导笔记
    Saliency map实现
    lime用法浅析
    LeetCode 989. 数组形式的整数加法
    题解:[P1009 阶乘之和]
    P1008三连击
    vim-2
    c#基础零碎记录
    asp.net core MySQL 數據遷移
    虚函数
  • 原文地址:https://www.cnblogs.com/quanjun/p/13753485.html
Copyright © 2011-2022 走看看