zoukankan      html  css  js  c++  java
  • codeforces 1132 F Clear the String

    题意:
    给你一个只含小写字母的字符串,每次只能删除一段含有一样字母区间,问最少删多少次,能删除整个字符串
    分析:
    状态:dp[i][j]代表区间i,j完全删除需要多少步
    转移:当存在i<=k<j,使得str[k]=str[j],那么我们可以将str[k+1~j]删除至
    只剩下str[j]一种字母的字串,然后和str[k]合并,省去一步的时间。
    例如babaca
    当i=1,j=6,k=4时
    将str[5~6] ca删至a,然后与baba合并,显然dp[5][6]中删除a的那一步就可以省去,所以k=4时,转移方程为:
    dp[1][6]=min(dp[1][6],d

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    #define maxn 510
    int dp[maxn][maxn];
    char str[maxn];
    int main()
    {
        //ios::sync_with_stdio(false);
        int n;scanf("%d",&n);
        scanf("%s", str+1);
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++)
        {
            dp[i][i]=1;
        }
        for(int L=2;L<=n;L++)
        {
            for(int i=1;i+L-1<=n;i++)
            {
                int j=i+L-1;
                dp[i][j]=n;
                for(int k=i;k<j;k++)
                {
                    if(str[k]==str[j])
                    {
                        dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]-1);
                    }
                    else
                    {
                        dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]);
                    }
                }
            }
        }
        printf("%d
    ",dp[1][n]);
        return 0;
    }

    p[1][4]+dp[5][6]-1);

  • 相关阅读:
    [转]学习B站动态转发抽奖脚本
    【LeetCode】236. 二叉树的最近公共祖先
    Java中邮件的发送
    最长递增子序列(LIS)
    最长公共子序列(LCS)
    【LeetCode】69. x 的平方根
    Lombok的使用
    Centos 中文乱码解决方法
    FWT,FST入门
    [UOJ310][UNR #2]黎明前的巧克力
  • 原文地址:https://www.cnblogs.com/cleanerhgf/p/10494799.html
Copyright © 2011-2022 走看看