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;
    }
  • 相关阅读:
    合代码、merge代码
    springboot 获取项目版本
    软考复习思路之疫情来的太突然之备战明年软考中级之软件设计师
    供应链管理笔记 概述2
    供应链管理笔记
    供应链管理 流程与实施1
    Winform中内嵌显示Office
    数据库提交数据注意事项
    工业互联网
    C#利用using System.Net实现Json数据提交WebAPI
  • 原文地址:https://www.cnblogs.com/fengzhiyuan/p/6890815.html
Copyright © 2011-2022 走看看