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

[CQOI2007] 涂色

时间:2024-10-28 15:22:17浏览次数:7  
标签:ch freopen int 染色 maxn 涂色 CQOI2007 dp

仔细想想其实没有dX说的那么夸张。

考虑一个结论:一定存在一种最优方案使得使得任意一次染色的区间一定是完全包含之前某一次染色区间或者与之前某一次染色区间完全不交且不与之前所有染色区间相交。

简单来说,如果我们当前的染色方案与之前某一次相交,那么我们完全可以缩短当前染色区间使得不交。

这样我们设 \(dp_{l,r}\) 表示染色区间为 \(l,r\) 时的答案,对上述两种情况分别考虑:

  • 完全包含。此时一定有 \(s_l=s_r\),那么 \(dp_{l,r}\) 可以由 \(dp_{l,r-1}\) 和 \(dp_{l+1,r}\) 转移过来。具体的,比如对于 ABA,它可以由 AB 直接转移,即第一次染色时可以向右端点多染一次。这里可能会有疑问,也许这种染色方式会不满足上文条件。但其实不要紧,因为就算不满足我们也可以通过前文的转化方式使其满足条件。等价于转移时不需要完全满足上文条件。

  • 完全不相交。我们在这里其实只需要考虑紧挨的情况,即类似 AABB,因为不紧挨的情况可以由多个紧挨的情况转移过来。所以只需要枚举断点 \(k\),合并累加两段答案即可。

#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read()
{
	int w=1,s=0;char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();}
	while(isdigit(ch)){s=s*10+(ch-'0');ch=getchar();}
	return w*s;
}
const int mod=998244353;
const int maxn=600;
const int inf=3e13+7;
char s[maxn];
int n;
int dp[maxn][maxn];
signed main()
{
#ifdef Lydic
	freopen(".in", "r", stdin);
	freopen(".out", "w", stdout);

//  #else
//   	freopen("Stone.in","r",stdin);
//   	freopen("Stone.out","w",stdout);
#endif
    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=2;len<=n;len++)
    {
        for(int l=1;l<=n-len+1;l++)
        {
            int r=l+len-1;
            if(s[l]==s[r])dp[l][r]=min(dp[l][r-1],dp[l+1][r]);
            else
            {
                for(int k=l;k<=r;k++)
                dp[l][r]=min(dp[l][r],dp[l][k]+dp[k+1][r]);
            }
        }
    }
    cout<<dp[1][n];
	return 0;
}

标签:ch,freopen,int,染色,maxn,涂色,CQOI2007,dp
From: https://www.cnblogs.com/Lydic/p/18510718

相关文章

  • P4170 [CQOI2007] 涂色 区间 dp
    P4170[CQOI2007]涂色区间dp模板题,不理解为什么是蓝。将现在考虑的区间\([l,r]\)分为\([l,k]\)和\([k+1,r]\),如果\(s_l=s_r\)就可以一起涂,少涂一次。方程:\[dp_{l,r}=\min_{k=l}^{r-1}dp_{l,k}+dp_{k+1,r}-[s_l=s_r]\]代码:#include<bits/stdc++.h>usingnamespac......
  • P4170 [CQOI2007] 涂色
    算法看完题目不好想到思路逆向思维,考虑从目标串刷成一个由全部相等的颜色组成的串由于一刷刷一堆想到区间状态设\(dp_{l,r}\)表示区间\([l,r]\)的最少涂抹次数状态转移分类讨论\(S_l=S_r\text{且}l<r\)此时分别去掉两个端点,观察发现设覆盖了\(l\)......
  • 【洛谷】P2261 [CQOI2007] 余数求和 的题解
    【洛谷】P2261[CQOI2007]余数求和的题解洛谷传送门题解这还是蓝题,这还是省选qaq题目看着很简单,但是真的很考验思路,思路对了,代码不到555分钟写完。刚开始做的时......
  • 【华为OD机试真题E卷】544、数字涂色 | 机试真题+思路参考+代码解析(E卷复用)(C++、Java
    文章目录一、题目......
  • P3703 树点涂色 题解
    Statement树,每个点有一个颜色,初始每个点颜色互不相同到根链涂上新颜色链颜色数\(u\)子树内点\(v\)到根路径的最多颜色数Solution首先,相同颜色的点一定构成一条从下往上的链考虑LCT,维护一个性质:一条实链的点的颜色相同.于是\(u\)到根的颜色数\(=\)\(u\)到根的虚......
  • [CQOI2007] 涂色
    [CQOI2007]涂色题意给出一个字符串,每个位置有一种颜色。有一个初始无颜色的字符串,每次可以把一段字符染成同一种颜色。求最少染多少次色,能把两个字符串变成一样。思路区间动态规划。定义\(dp_{i,j}\)表示把\([l,r]\)这段区间染成一样需要的最小次数。发现染色有两种......
  • 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\)上的所......