首页 > 其他分享 >CF1572C Paint

CF1572C Paint

时间:2023-03-23 22:47:30浏览次数:42  
标签:10 ch int void CF1572C Paint isdigit

CF1572C Paint

一看感觉很有 dp 的感觉。所以就来吧。

设 \(f_{l,r,c}\) 表示区间 \([l,r]\) 选了颜色 \(c\) 的答案,先不管怎么转移。

状态太巨大,有种猜结论的冲动:若只保留 \(c=a_l\) 和 \(c=a_r\),答案依旧正确。

考虑证明:答案只和 \(f_{1,n}\) 有关,这时候若对 \(a_1\) 或 \(a_n\) 做了单点染色,则一定可以通过染色补集使得答案不劣。所以我们可以惊喜地发现只需要保留右端点的颜色信息。

现在就有个暴力的转移了。

\[f_{l,r} = \min \{ f_{k,r-1} + 1, \min_k \{ f_{l,k} + f_{k + 1, r} + [a_k \neq a_r] \} \} \]

这个 \(k\) 一看就能优化。考虑到数据的特殊性质,不难猜出只用枚举相同颜色的 \(k\),因为剩下的 \(k\) 都可以通过中间的可转移的点最终转移到 \(f_{l,r}\)。那么复杂度就是 \(O(n^2)\)

#include <bits/stdc++.h>
 
using namespace std;
 
typedef long long LL;
 
namespace IO {
  #define isdigit(x) (x >= '0' && x <= '9')
  template<typename T>
  inline void read(T &x) {
    x = 0; char ch = getchar(); int f = 0;
    for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = 1;
    for(; isdigit(ch); ch = getchar()) x = x * 10 + ch - '0';
    if(f) x = -x;
  }
  template<typename T>
  inline void write(T x) {
    if(x < 0) putchar('-'), x = -x;
    if(x > 9) write(x / 10);
    putchar(x % 10 + '0');
  }
  #undef isdigit
}
using namespace IO;
 
const int N = 3e3 + 10;
int n, a[N], las[N], pre[N];
int f[N][N];
 
inline void upd(int &x, int y) {
  x = min(x, y);
}
 
void solve() {
  read(n);
  for(int i = 1; i <= n; ++i)
    read(a[i]), las[a[i]] = 0;
 
  for(int i = 1; i <= n; ++i) {
    pre[i] = las[a[i]];
    las[a[i]] = i;
  }
 
  for(int len = 2; len <= n; ++len) {
    for(int l = 1; l + len - 1 <= n; ++l) {
      int r = l + len - 1;
      f[l][r] = f[l][r - 1] + 1;
      for(int j = pre[r]; j >= l; j = pre[j])
        upd(f[l][r], f[l][j] + f[j + 1][r]);
    }
  }
  printf("%d\n",f[1][n]);
}
 
int main() {
  int T; read(T);
  while(T--) solve();
}

标签:10,ch,int,void,CF1572C,Paint,isdigit
From: https://www.cnblogs.com/DCH233/p/17249781.html

相关文章

  • QT5笔记:18 QPainter基本绘图 完结撒花,感谢陪伴!!!
    代码#include"widget.h"#include"ui_widget.h"#include<QPainter>Widget::Widget(QWidget*parent):QWidget(parent),ui(newUi::Widget){......
  • 【CF1572C Paint】(区间dp)
    原题链接题意给定长度为\(n\)的颜色序列\(a_i\),每次你可以选择任意长度的连续且颜色相同的一段位置,将其全部变成任意同一种颜色,问你最少总共需要多少次操作才能使得整......
  • Qt音视频开发23-视频绘制QPainter方式(占用CPU)
    一、前言采集到的图片,用painter绘制是最基础的方式,初学者可能第一次尝试显示图片用的qlabel的setpixmap,用下来会发现卡成屎,第二次尝试用样式表设置背景图,依然卡成屎,最终选......
  • P4084 Barn Painting G
    \(P4084\)\(Barn\)\(Painting\)\(G\)一、题目描述给定一颗\(N\)个节点组成的树,\(3\)种颜色,其中\(K\)个节点已染色,要求任意两相邻节点颜色不同,求合法染色方案数。二、......
  • Paint the Middle (提取信息转化为熟悉问题->线段覆盖问题)
     通过题目信息来进行转化成熟悉的问题首先提取出性质a......a里面的数都可以改,然后选择最远的2个aa是最优的于是就有很多区间,可能交互,就贪心让更少的区......
  • QPaint绘制频谱图基础原理(使用QImage)
    振幅周期固定,产生相应数据周期固定,振幅随机,产生相应数据 使用模拟随机数据 核心代码如下:1#include"thspectrum.h"23#include<math.h>45ThSpectr......
  • 多传感器融合:MVP和PointPainting
    多传感器融合相关的理论真的可以非常复杂,而在感知方面,由于可以和深度学习做结合,所以很多工作可以变得简单有效,有时候一个简单的特征融合都会有很好的效果。本文结合3D物体......
  • J. Abstract Painting (2020 CCPC 长春)
    J.AbstractPaintingtag:dp题目链接题意:有个很抽象的人要画一幅抽象画,这个抽象画只需要画圆圈就完事了(我上我也行)需要满足以下条件圆心都必须在x轴上的[1,n]上,且必......
  • 使用canvas与Paint在View中居中绘制文字
    我们在自定义View中有的时候会想自己绘制文字,自己绘制文字的时候,我们通常希望把文字精确定位,文字居中(水平、垂直)是普遍的需求,所以这里就以文字居中为......
  • 页面的重绘(repaint)与重排(reflow)
    1重绘(repaint):屏幕的一部分要重绘。渲染树节点发生改变,但不影响该节点在页面当中的空间位置及大小。譬如某个div标签节点的背景颜色、字体颜色等等发生改变,但是该div标签......