首页 > 其他分享 >[CQOI2007] 涂色

[CQOI2007] 涂色

时间:2024-09-19 19:34:53浏览次数:11  
标签:min int 染色 染成 涂色 CQOI2007 dp

[CQOI2007] 涂色

题意

给出一个字符串,每个位置有一种颜色。

有一个初始无颜色的字符串,每次可以把一段字符染成同一种颜色。

求最少染多少次色,能把两个字符串变成一样。

思路

区间动态规划。

定义 \(dp_{i,j}\) 表示把 \([l,r]\) 这段区间染成一样需要的最小次数。

发现染色有两种方法:

  1. AABBB 左右分开染色。
  2. AABBAAA 先染成 A,再把中间染成 B。

对于第一种染色方法,转移方程即 \(dp_{i,j}=\min_{i\le k < j} dp_{i,k}+dp_{k+1,j}\)。

对于第二种染色方法,必须满足 \(S_i=S_j\),转移方程 \(dp_{i,j}=\min dp_{i,j-1},dp_{i+1,j}\)。

就是染 \(j\) 时,把区间向左扩展到 \(i\) 再继续剩下的染色。

或者染 \(i\) 时,把区间向右扩展到 \(j\) 再继续剩下的染色。

代码

#include <bits/stdc++.h>
using namespace std;
const int N = 55;
char S[N];
int dp[N][N], n;
int main() {
	scanf("%s", S + 1);
	n = strlen(S + 1);
	memset(dp, 0x3f, sizeof(dp));
	for (int i = 1; i <= n; i ++) dp[i][i] = 1;
	for (int len = 1; len <= n; len ++) {
		for (int i = 1; i <= n; i ++) {
			int j = i + len;
			if (j > n) break;
			if (S[i] == S[j]) 
				dp[i][j] = min(dp[i + 1][j], dp[i][j - 1]);
			for (int k = i; k < j; k ++)
				dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j]);
		}
	}
	cout << dp[1][n] << "\n";
	return 0;
}

标签:min,int,染色,染成,涂色,CQOI2007,dp
From: https://www.cnblogs.com/maniubi/p/18421210

相关文章

  • P2261 [CQOI2007] 余数求和 题解
    题目传送门思路数学数学非常经典的题目注意到\(k\bmodi=k-\lfloork/i\rfloor*i\)。于是可以对题目进行转化,从求\(G(n,k)=\sum_{i=1}^kn\bmodi\)变为求\(G(n,k)=n\timesk-\sum_{i=1}^n\lfloork/i\rfloor\timesi\),所以仅需求出\(\sum_{i......
  • 洛谷题单指南-动态规划3-P4170 [CQOI2007] 涂色
    原题链接:https://www.luogu.com.cn/problem/P4170题意解读:长度为n的字符串,每次可以将连续一段填为同一个字符,求要填成目标串的最少填涂次数。解题思路:1、状态表示:设s表示目标字符串,dp[i][j]表示将i~j涂成目标"颜色"的最少次数2、状态转移考虑i~j的两端,当i==j,说明只有一个......
  • 涂色
    这一道题目可以感觉到,如果没有覆盖全部区间的一次涂色,那么一定会有一个分界点也就是证如下结论:存在一种最优的方案满足对于任意两次染色:它们的区间要么不交,要么靠后的那次被靠前的那次包含证明只是反证法然后做一些分类讨论。比如,如果两次染色的区间相交但不包含,你可以缩短靠前......
  • P3703 树点涂色笔记
    又是一道妙题,加深了蒟蒻对\(\text{LCT}\)的理解。题意给定一棵\(n\)个节点的有根树,根节点为\(1\)。最开始每个节点都有颜色,且颜色互不相同。定义一条路径的权值为:改路径上点的不同颜色数。现在一共会有\(m\)组询问,每组询问有三种:1x将\(x\)到根节点\(1\)上的所......
  • [春季测试 2023] 涂色游戏
    题目描述有一天,小D在刷朋友圈时看到了一段游戏视频。这个游戏的名字叫涂色游戏,视频中的游戏界面是一个\(n\)行\(m\)列的网格,初始时每一个格子都是白色(用数字\(0\)表示)。其中每一行的左侧、每一列的上方都有一把带颜色的刷子。玩家点击某个刷子后,这个刷子会将其右侧(或下......
  • [SDOI2017] 树点涂色
    [SDOI2017]树点涂色题目描述Bob有一棵\(n\)个点的有根树,其中\(1\)号点是根节点。Bob在每个点上涂了颜色,并且每个点上的颜色不同。定义一条路径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色。Bob可能会进行这几种操作:1x表示把点\(x\)到根节点的路......
  • 涂色
    首先是一种对于这个问题的新的建树方法然后注意lazy标记最开始要初始化为0,不能为1或2,为0的时候表示自己当前的操作已经全部传递给子节点了注意lazy表示的是自己已经完成修改,但是子节点还没有修改,无论是这道题目还是普通的区间加减,我们在递归到一个节点的时候,他的所有祖先结点......
  • P4170 [CQOI2007] 涂色(天赋哥不要点进来)
    前言翻遍洛谷题解,看到大家都在套模板,却很少有人讲出为什么,使我十分崇拜天赋哥。原题链接关于这题的一些事实性证据事实1.来自事实2.来自事实3.来自事实4.来自整理上述事实1.每一次”最短“最优涂色,要么在其他颜色的基础上涂,这称之为融入一个整体;要么另辟蹊径单独......
  • Q7.4.1.2. 奇怪的方格涂色 题解
    原题链接首先想到暴力网络流:考虑最小割,\(S\)表示染黑色,\(T\)表示染白色。每个格子\(i\),连\((S,i,b_i)\),\((i,T,w_i)\)。怎么处理“奇怪的方格”?连\((i,i^\prime,p_i)\)和\((i^\prime,j,+\infty)\)。表示如果\(i\)归属于\(S\)(染黑色),那么就只能忍受奇怪所带来的\(p_i\)......
  • [刷题笔记] CF1132F Clear the String & [CQOI2007] 涂色
    Problem1Problem2双倍经验qwqDescription初始时数组为空,每次可以选择一个区间\(l-r\)将其赋为同一个值,赋的值可以覆盖,给定数组的目标形式,求至少经过多少次操作使得空数组变成目标形式。Solution我们发现每次选择一个区间,大区间包含小区间,小区间可以推到大区间。因此考虑区间......