zoukankan      html  css  js  c++  java
  • 小明的喷漆计划

    小明的喷漆计划

    时间限制: 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;
    }
  • 相关阅读:
    PHP遍历数组元素
    In PHP5, what is the difference between using self and $this? When is each appropriate?
    了解如何构建 Metro 样式的应用程序
    HTML5在路上
    meta 之 viewport
    dede数据库连接文件
    windows 环境安装wamp软件实现php开发环境
    域名空间那些事
    Javascript编程风格
    apache 服务器修改网站默认首页
  • 原文地址:https://www.cnblogs.com/fengzhiyuan/p/6890815.html
Copyright © 2011-2022 走看看