首页 > 其他分享 >CF1927G. Paint Charges

CF1927G. Paint Charges

时间:2024-03-14 19:55:05浏览次数:21  
标签:Charges min int 染色 Paint maxn CF1927G dp define

Problem - 1927G - Codeforces

  • 做这道题的时候自己把 \(dp\) 式子卡的太死了,导致怎么想都想不出来,但正解的 \(dp\) 设的是很宽松的

  • 设 \(dp_{i,j,k}\) 表示考虑前 \(i\) 个数,所有中第一个没被染色的是 \(j\),在 \(i\) 后面第一个没被染到的是 \(k\)

  • 转移就判断第 \(i\) 个数向左向右还是不选即可

  • \(O(n^3)\)

  • 这个题还可以 \(O(n^2)\),而且和 \(O(n^3)\) 的式子好像几乎没什么关系

  • 设 \(f_i\) 表示让 \(1 \sim i\) 染上颜色的最少操作次数

  • 发现有三种可能:

    • 让 \(i\) 向左边染色,\(f_i = \min\limits_{j = l_i}^{i} f_{j - 1}\)

    • 让 \(j\) 向右边染色覆盖过 \(i\),\(f_i = \min\limits_{j = 1 \& r[j] \geq i}^{ i - 1} f_{j - 1}\)

    • 让 \(j\) 向右覆盖过 \(i\),在 \([j,i]\) 中找一点 \(k\) 向左覆盖过 \(j\),转移挺难写的略

  • 直接转移即可,第三种要通过改变枚举顺序简单优化一下

  • 复杂度 \(O(n^2)\)

#include<bits/stdc++.h>
#define ll long long
#define ckmin(a, b) (a = min(a, b))
#define ckmax(a, b) (a = max(a, b))
#define pcn putchar('\n');
using namespace std;
template<typename T>T &read(T &x){
	cin >> x;
	return x;
}

const int maxn = 150;

int n, l[maxn], r[maxn];
int dp[maxn];

void mian(int TwT){
	read(n);
	int a;
	for(int i = 1; i <= n; ++ i){
		read(a);
		l[i] = max(i - a + 1, 1);
		r[i] = min(i + a - 1, n);
	}
	
	for(int i = 1; i <= n; ++ i){
		dp[i] = n + 5;
	}
	dp[0] = 0;
	
	for(int i = 1; i <= n; ++ i){
		for(int j = l[i]; j <= i; ++ j){
			ckmin(dp[i], dp[j - 1] + 1);
		}
		
		for(int j = 1; j <= i; ++ j){
			if(r[j] < i) continue;
			
			ckmin(dp[i], dp[j - 1] + 1);
		}
		
		int L = i + 1, R = i, x = i;
		
		for(int j = i - 1; j >= 1; -- j){
			if(r[j] < i) continue;
			
			R = min(L - 1, j);
			
			for(; x > j; -- x){
				if(l[x] > j) continue;
				
				ckmin(L, l[x]);
			}
			
			for(int k = L; k <= R; ++ k){
				ckmin(dp[i], dp[k - 1] + 2);
			}
		}
	}
	
//	for(int i = 1; i <= n; ++ i){
//		printf("%d ", dp[i]);
//	}
//	pcn;
	
	printf("%d\n", dp[n]);
}

void init(int TwT){
	
}

int main(){
	
	int T = 1;
	read(T);
	
	for(int TwT = 1; TwT <= T; ++ TwT){
		init(TwT);
		mian(TwT);
	}
	
	return 0;
}
/*
1
2
2 1
*/

标签:Charges,min,int,染色,Paint,maxn,CF1927G,dp,define
From: https://www.cnblogs.com/fox-konata/p/18073780

相关文章

  • 如何在Qt的 paintEvent之外进行绘制
    QPainter默认只能在paintEvent中进行绘制这在有些情况下会很不方便,有时候我们希望可以在任意地方直接进行绘制 为了实现这个目的,可以采用以下方法:继承QWidget,通过子类提供直接绘制的方法,并将所有绘制保存到中间的QPixmap最后在重载的paintEvent中将QPixmap复制显示:#prag......
  • [USACO13MAR]Farm Painting S 题解
    看大家好多写的都用了四维偏序,给一个不用偏序的解法。简化一下题目,就是给你\(n\)个矩形,第\(i\)个矩形用\((x1_i,y1_i,x2_i,y2_i)\)表示,问你有多少个\(i\)满足:不存在另一个\(j\)使得\(x1_j\lex1_i\lex2_j\wedgey1_j\ley1_i\ley2_j\)。我们从左到右扫描每一个......
  • [ARC108F] Paint Tree
    本题有两种思路。首先,对于普通的树,到一个点最远的点一定是直径的端点之一。记\(S\)表示直径长度。做法\(1\)先求出一条直径,若直径的两个端点颜色相同,则最长距离一定为直径。否则,令两个端点分别为\(x,y\),并钦定\(x,y\)不同色。枚举答案\(d\),所有到\(x\)距离\(>d\)的......
  • P4084 [USACO17DEC] Barn Painting G
    原题链接题解1.对于没有固定颜色的节点来说,每个节点只会有三种颜色,而这又是一棵树,树形dp由此而来2.由相邻节点不同确定转移方程3.即使有求模也可能要开longlongcode#include<bits/stdc++.h>usingnamespacestd;#definelllonglongconstllmod=1e9+7;vector<ll>......
  • CF1927G Paint Charges
    题意简述你有\(n\)个道具,对于第\(i\)个道具,你可以选择覆盖\([i-a_i+1,i]\)或\([i,i+a_i-1]\),或者什么都不做。求覆盖所有\(1\simn\)所需要的道具的最小数目。\(n\le100\)。\(O(n^3)\)解法首先明确一个事实:被一个或多个区间包含的区间,使用该区间对应的道具是没有......
  • G. Paint Charges
    G.PaintChargesAhorizontalgridstripof$n$cellsisgiven.Inthe$i$-thcell,thereisapaintchargeofsize$a_i$.Thischargecanbe:eitherusedtotheleft—thenallcellstotheleftatadistancelessthan$a_i$(from$\max(i-a_i+1,1)......
  • CodeForces 1927G Paint Charges
    洛谷传送门CF传送门看到\(n\le100\)考虑\(O(\text{poly}(n))\)dp。发现从左向右决策,因为一个点可以向左或向右覆盖,所以需要记最靠左的未覆盖的位置\(j\)和最靠右的已覆盖位置\(k\),状态就是\(f_{i,j,k}\),dp最小的覆盖次数。转移的讨论很简单。考虑不覆盖还是向左......
  • CF1764H Doremy's Paint 2 题解
    题目链接:CF或者洛谷高分题,感觉挺有意思的题,值得一提的是这个题的\(1\)和\(3\)版本却是两个基础题。一开始以为跟这道差不多:P8512[YnoiEasyRound2021]TEST_152题解。后面重新读了一下发现一个有趣的点:也就是是说操作的\(val\)并不太好搞了,如果\(val\)确定就基......
  • MFC OnPaint 绘制一行简单文字
    ▲绘制一行简单文字OnPaint()消息。voidCMFCApplication6Dlg::OnPaint(){CPaintDCcdc(this);/***OnPaint绘制简单文字*****/cdc.TextOutW(100,100,TEXT("你好,MFC!")); if(IsIconic()) { CPaintDCdc(this);//用于绘制的设备上下文 SendMessa......
  • CF1764H Doremy's Paint 2 题解
    题目链接先断环成链,由于对于多组询问不好一起处理,我们先考虑单组询问的处理方式。一个很暴力的想法是每次模拟题目要求的操作并且最后数颜色,我们这是在通过下标进行操作最后再数颜色,而很多对于下标的操作都是不必要的,考虑直接枚举颜色进行判定。对于每种颜色,它对于最后答案有贡......