zoukankan      html  css  js  c++  java
  • codeforces#1132 F. Clear the String(神奇的区间dp)

    题意:给出一个字符串S,|S|<=500。每次操作可以删除一段连续的相同字母的子串。问,最少操作多少次可以把这个字符串变成空串。

    分析:刚开始的思路是,把连续的串给删除掉,然后再。。。。贪心。完全没想到这个题目会是用区间dp来做,惭愧。。。

    虽然后来知道是区间dp,但是想了很久也没想到如何dp。最后看了别人的博客,dp确实有点神奇。

     

    $m imes 10^{k_{1}-1}$

    ac代码:

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=505;
    int dp[maxn][maxn];
    char word[maxn];
    int main()
    {
        int n;
        scanf("%d",&n);
        scanf("%s",word+1);
        for(int len=1;len<=n;len++)
        {
            for(int l=1;len+l-1<=n;l++)
            {
                int r=len+l-1;
                if(word[r]==word[l])
                    dp[l][r]=dp[l+1][r-1]+1;
                else
                    dp[l][r]=min(dp[l+1][r],dp[l][r-1])+1;
                for(int k=l+1;k<=r-1;k++)
                    dp[l][r]=min(dp[l][k]+dp[k][r]-1,dp[l][r]);
            }
        }
        printf("%d
    ",dp[1][n]);
        return 0;
    }
    

      

     

  • 相关阅读:
    JDBC的简单笔记
    javascript学习笔记二
    javascript学习一、js的初步了解
    css的简单学习笔记
    c++ 拷贝构造函数
    C++ new delete
    c++ 析构函数
    c++成员初始化和构造函数
    C++ 类和对象浅解
    c++ constexpr
  • 原文地址:https://www.cnblogs.com/carcar/p/10512558.html
Copyright © 2011-2022 走看看