首页 > 其他分享 >【CF1572C Paint】(区间dp)

【CF1572C Paint】(区间dp)

时间:2023-03-13 21:00:09浏览次数:52  
标签:颜色 题意 int CF1572C Paint 序列 区间 include dp

原题链接

题意

给定长度为 \(n\) 的颜色序列 \(a_i\),每次你可以选择任意长度的连续且颜色相同的一段位置,将其全部变成任意同一种颜色,问你最少总共需要多少次操作才能使得整个序列颜色相同。

限制: 每一种颜色初始时在序列中最多只有 20 个位置(是该种颜色)。

\(n \leq 3000\)。

思路

考虑将区间 \([l,r]\) 内染成同一种颜色,最暴力的办法就是钦定一种颜色,每次选择一个位置染成该颜色,那么最坏情况下需要染 \(r-l\) 次。而如果当前区间的两端颜色相同,那么就可以减少一次染色操作。这启发我们在序列中选取若干个相同颜色的点对,如下图所示:

image

显然,如果选取的两对点对相交,那么也只能减少一次操作了。

于是题意就转化为了在序列中选取最多不相交的相同颜色点对。可以考虑区间 dp。

令 \(f_{l,r}\) 为在 \([l,r]\) 区间内最多选取的点对数量,得到转移方程:

\[f_{l,r}=\max(f_{l+1,r},\max_{a_k=a_r} )f_{i+1,k-1}+1+f_{k,j} \]

这个转移的实质上就是在枚举左端点可以和哪一个点配对,由于一个点可以同时向左和向右配对,所以转移方程里是 \(f_{k,j}\) 而不是 \(f_{k+1,j}\)。

根据题意,区间中满足 \(a_k=a_r\) 的位置不超过 20,所以这样转移的复杂度是正确的。

code:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int N=3030;
int f[N][N],n,a[N];
vector<int>pos[N];
void chkmax(int &a,int b){if(a<b) a=b;}
void solve()
{
	scanf("%d",&n);for(int i=1;i<=n;i++) pos[i].clear();
	for(int i=1;i<=n;i++) scanf("%d",&a[i]),pos[a[i]].push_back(i),f[i][i]=0;
	for(int len=2;len<=n;len++)
	    for(int l=1,r=l+len-1;r<=n;l++,r++)
	    {
	    	f[l][r]=f[l+1][r];
	    	for(auto k:pos[a[l]])
	    	{
	    		if(k<=l) continue;if(k>r) break;
	    		chkmax(f[l][r],f[l+1][k-1]+1+f[k][r]);
	    		//f[k][r]而不是f[k+1][r],因为可以同时优化l,k,r 
			}
		}
	printf("%d\n",n-1-f[1][n]);
}
int main()
{
	int T;scanf("%d",&T);while(T--) solve();
	return 0;
}

标签:颜色,题意,int,CF1572C,Paint,序列,区间,include,dp
From: https://www.cnblogs.com/ListenSnow/p/17212857.html

相关文章

  • 【LOJ 3378】点格棋(DP)(推论)
    点格棋题目链接:LOJ3378题目大意有一个(n+1)*(m+1)的格点组成的网格,然后两个人轮流操作,选两个相邻(距离为1)且没有连边的点对连一个竖直或者水平的线段。然后如果一个......
  • ovs-dpdk:revalidator源码解析
    revalidator是做什么的?需要知道哪些东西?有关于revalidator需要弄明白的是以下三个问题:通过ovs-vsctllistopen_vs可以看到other_config里面有两个变量线程数配置:n-han......
  • 4.docker错误Error response from daemon: driver failed programming external conne
    1.docker端口映射或启动容器时报错Errorresponsefromdaemon:driverfailedprogrammingexternalconnectivityonendpointquirky_allenErrorresponsefromdaemon......
  • Ubuntu系统将对HiDPI提供更好的支持
    Canonical的MichaelHall和System76社区经理RyanSipes发布联合声明,宣布两家公司将开展合作在Ubuntu Linux系统上改善对HiDPI的支持。事实上,上周System76的一组工程团......
  • P2015 二叉苹果树 二叉树dp
    P2015二叉苹果树-洛谷|计算机科学教育新生态(luogu.com.cn)这道题之所以可以不用背包树形的原因是:它一个经典二叉树dp问题令son[x][0]为x的左儿子,son[x][1]为x的右......
  • P2015 二叉苹果树 背包树形dp入门
    P2015二叉苹果树-洛谷|计算机科学教育新生态(luogu.com.cn) 背包树形dp主要是用来处理可以取若干个子节点若干个情况,来实现dp转移到父节点我们令dp[x][y][i]为......
  • 基于LAMP搭建WordPress博客
    1、安装Apache。1)执行如下命令,安装Apache服务及其扩展包。yum-yinstallhttpdmod_sslmod_perlmod_auth_mysql2)执行如下命令,查看Apache是否安装成功。httpd-v3......
  • 2020 年百度之星·程序设计大赛 - 初赛一 Dec 二维DP,预处理
    problemDecAccepts:1284Submissions:4572TimeLimit:2000/1000MS(Java/Others)MemoryLimit:32768/32768K(Java/Others)ProblemDescription初始有a,ba,b......
  • 通过matlab对比规则LDPC和非规则LDPC的误码率
    1.算法描述       LDPC码是麻省理工学院RobertGallager于1963年在博士论文中提出的一种具有稀疏校验矩阵的分组纠错码。几乎适用于所有的信道,因此成为编码界近年......
  • Android 集合数据在Sharedpreferences中的增删改查
    Android集合数据在Sharedpreferences中的增删改查Sharedpreferences作为一个轻量化的Android本地存储方式相信很多人都为其不能存集合而烦恼所以呢,我封了两个简易的方法希......