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\n",dp[1][n]);
    return 0;
}

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

猜你喜欢

转载自www.cnblogs.com/cleanerhgf/p/10494799.html