蓝桥杯 3. 涂色

题目描述

假设你有一条长度为 5 的木板,初始时没有涂过任何颜色。你希望把它的 5 个单位长度分别涂上红、绿、蓝、绿、红色,用一个长度为 5 的字符串表示这个目标:RGBGR

每次你可以把一段连续的木板涂成一个给定的颜色,后涂的颜色会覆盖先涂的颜色。

例如:

  • 第一次把木板涂成 RRRRR
  • 第二次涂成 RGGGR
  • 第三次涂成 RGBGR,达到目标

请你计算用尽量少的涂色次数达到目标。


输入描述

输入仅一行,包含一个长度为 n 的字符串,即涂色目标。字符串中的每个字符都是一个大写字母,不同的字母代表不同颜色,相同的字母代表相同颜色。

  • 1 ≤ n ≤ 50

输出描述

输出仅一行,包含一个整数,即最少的涂色次数。


输入输出样例

示例 1

输入
in 复制代码
AAAAA
输出
out 复制代码
1

c++代码

cpp 复制代码
#include<bits/stdc++.h>

using namespace std;

string str;
int n;
vector<vector<int>> dp;

int main() {
    cin >> str;
    n = str.size();
    dp = vector<vector<int>>(n, vector<int>(n, INT_MAX));
    for (int len = 1; len <= n; len++) {
        for (int i = 0; i + len - 1 < n; i++) {
            int j = i + len - 1;
            if (i == j) dp[i][j] = 1;
            else if (str[i] == str[j]) {
                int a = INT_MAX, b = INT_MAX;
                if (i + 1 < n) a = dp[i + 1][j];
                if (j - 1 >= 0) b = dp[i][j - 1];
                dp[i][j] = min(a, b);
                if (dp[i][j] == INT_MAX) dp[i][j] = 1;
            }
            else {
                for (int k = i; k < j; k++) {
                    dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j]);
                }
            }
        }
    }
    cout << dp[0][n - 1];
    return 0;
}//by wqs
相关推荐
AI科技星4 分钟前
全域数学·72分册:场计算机卷【乖乖数学】
算法·机器学习·数学建模·数据挖掘·量子计算
云泽80825 分钟前
C++11 核心特性全解:列表初始化、右值引用与移动语义实战
开发语言·c++
科研前沿1 小时前
镜像孪生VS视频孪生核心技术产品核心优势
大数据·人工智能·算法·重构·空间计算
水蓝烟雨1 小时前
1931. 用三种不同颜色为网格涂色
算法·leetcode
AI进化营-智能译站1 小时前
ROS2 C++开发系列12-用多态与虚函数构建可扩展的ROS2机器人行为模块
开发语言·c++·ai·机器人
晨曦夜月1 小时前
map与unordered_map区别
算法·哈希算法
Morwit1 小时前
QML组件之间的通信方案(暴露子组件)
c++·qt·职场和发展
qeen872 小时前
【数据结构】建堆的时间复杂度讨论与TOP-K问题
c语言·数据结构·c++·学习·
图码2 小时前
如何用多种方法判断字符串是否为回文?
开发语言·数据结构·c++·算法·阿里云·线性回归·数字雕刻
handler012 小时前
Linux 内核剖析:进程优先级、上下文切换与 O(1) 调度算法
linux·运维·c语言·开发语言·c++·笔记·算法