小明的喷漆计划

小明的喷漆计划

时间限制: 5 Sec  内存限制: 128 MB
提交: 22  解决: 17
[提交][状态][讨论版]

题目描述

小明极其喜欢涂鸦,总是在墙上涂上各种颜色的漆。现在小明得到一个任务,需要喷涂一段空白围墙,且单位长度内的颜色都是相同的。小明有一种喷涂工具,它可以给任意长度的一段墙面涂上任意颜色的漆,这样的操作计为一次操作。小明要完成这个任务,又想使得操作次数尽量少,就请你帮他解决这个问题吧。

输入

有多组输入数据。 
每组包含一个长度不超过100的字符串(均由小写字母组成),代表需要涂鸦的墙面目标状态

输出

至少需要几次操作,可达到目标

样例输入

aaaaaa
fedcbaabcdef
aaabbbbb
aaabbbaaa

样例输出

1
6
2
2
这道题的转移和括号序列的非常相似,如果l与r的颜色一则dp[l][r]=min(dp[l][r],dp[l][k]+dp[k+1][r]-1)
否则dp[l][r]=min(dp[l][r],dp[l][k]+dp[k+1][r]);
#include<algorithm>
#include<iostream>
#include<cmath>
#include<cstring>
#include<string>
const int MAXN=107;
using namespace std;
int dp[MAXN][MAXN],len;
char s[MAXN];
void dfs(int l,int r);
int main()
{
    while (~scanf("%s",s))
    {
        len=strlen(s);
        memset(dp,-1,sizeof(dp));
        dfs(1,len);
        printf("%d
",dp[1][len]);
    }
}
void dfs(int l,int r)
{
    if (l==r) 
    {
        dp[l][r]=1;
        return;
    }
    if (dp[l][r]!=-1) return;
    int res=MAXN*MAXN;
    for (int i=l;i<r;i++)
    {
        dfs(l,i);dfs(i+1,r);
        if (s[l-1]==s[r-1]) res=min(res,dp[l][i]+dp[i+1][r]-1);
        else res=min(res,dp[l][i]+dp[i+1][r]);
    }
    dp[l][r]=res;
    return;
}
原文地址:https://www.cnblogs.com/fengzhiyuan/p/6890815.html