首页 > 其他分享 >题解:AT_pakencamp_2019_day3_d パ研軍旗

题解:AT_pakencamp_2019_day3_d パ研軍旗

时间:2024-09-15 15:23:48浏览次数:1  
标签:case 颜色 int 题解 复杂度 break 2019 return pakencamp

题意简述

给定 \(5\) 行 \(N\) 列的网格,每个格子有四种可能的颜色。

要使网格中每一列的颜色都一样但不能是黑色,并且相邻两列的颜色不相同。问最少改变多少个格子的颜色能满足要求。

思路分析

为方便处理,把给定的红色、蓝色、白色、黑色分别转成数字 \(1,2,3,4\)。

考虑 dp。

不妨设 \(c_{i,j}\) 为将第 \(i\) 列全部变成第 \(j\) 种颜色的代价,\(f_{i,j}\) 表示第 \(i\) 列变成第 \(j\) 种颜色时前 \(i\) 列的总代价。

那么思路就很简单了。对于当前列的当前颜色,其总代价应为前一列不同颜色的总代价的最小值将当前列转变为当前颜色的代价的和,即状态转移方程为 \(f_{i,j}=\min(f_{i-1,k})+c_{i,j}(j \ne k)\),最后在最后一列的几种颜色中取最小值即可。

细节内容见代码注释。

代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1005;
int n,ans=0x3f3f3f3f,mp[10][N],c[N][5],f[N][5];//mp表示原矩阵,c和f如上文 
//将字符转为数字 
int change(char ch){
	switch(ch){
		case 'R':return 1;break;
		case 'B':return 2;break;
		case 'W':return 3;break;
		case '#':return 4;break;
	}
}
int main(){
	cin>>n;
	for(int i=1;i<=5;++i)
		for(int j=1;j<=n;++j){
			char ch;cin>>ch;
			mp[i][j]=change(ch);
		}
	//预处理代价 
	for(int i=1;i<=n;++i)//枚举列 
		for(int j=1;j<=3;++j)//枚举颜色,因为不能是黑色,所以只枚举三种 
			for(int k=1;k<=5;++k){
				if(mp[k][i]==j)continue;
				++c[i][j];
			}
	for(int i=1;i<=n;++i){
		for(int j=1;j<=3;++j){
			f[i][j]=0x3f3f3f3f;
			for(int k=1;k<=3;++k){
				if(j==k)continue;//相邻两列颜色不能一样 
				f[i][j]=min(f[i][j],f[i-1][k]+c[i][j]);//状态转移 
			}
		}
	}
	//在最后一列的几种颜色中取最小值 
	for(int i=1;i<=3;++i)ans=min(ans,f[n][i]);
	cout<<ans;
	return 0;
}

时间复杂度分析

用 \(N\) 表示网格列数,\(M\) 表示网格行数,\(K\) 表示颜色数量,则预处理的时间复杂度为 \(O(NMK)\),dp 时间复杂度为 \(O(NK^{2})\)。本题中 \(M\) 和 \(K\) 都为常数,故时间复杂度较低,通过此题没有任何问题。

标签:case,颜色,int,题解,复杂度,break,2019,return,pakencamp
From: https://www.cnblogs.com/ezhe/p/18415273

相关文章

  • 题解:AT_abc371_c [ABC371C] Make Isomorphic
    题目大意有两个简单无向图,你每一次可以给第二个图添上或去掉一条边,有相应花费,问将两个图变为同构最少需要花费多少钱。思路观察数据范围,可以发现NNN非常小,可以考虑枚......
  • 「KDOI-06-S」题解
    T2树上异或题面分析树形DP题考虑一颗子树内部的某种割边方式,假设其被分为\(n\)个连通块,每个连通块的权值分别为\(a_1,a_2,\dots,a_n\),那么该子树在这种割边方式下对答案的贡献就为\(\prod_{i=1}^{n}a_i\)。因此就可以从叶子向根不断合并,求出每种割边状态的值,时......
  • 【洛谷 P1596】[USACO10OCT] Lake Counting S 题解(深度优先搜索)
    [USACO10OCT]LakeCountingS题面翻译由于近期的降雨,雨水汇集在农民约翰的田地不同的地方。我们用一个的网格图表示。每个网格中有水(W)或是旱地(.)。一个网格与其周围的八个网格相连,而一组相连的网格视为一个水坑。约翰想弄清楚他的田地已经形成了多少水坑。给出约翰田地的示意图,......
  • 【网络安全】漏洞挖掘之CVE-2019-9670+检测工具
    未经许可,不得转载。文章目录漏洞介绍正文工具漏洞介绍CVE-2019-9670是一个与ZimbraCollaborationSuite(ZCS)相关的严重漏洞。ZCS中的AutoDiscover服务存在不正确的XML解析处理,该漏洞可被利用来注入恶意XML代码(例如外部实体注入(XXE)攻击),从而导......
  • Codeforces Round 972 (Div. 2) 2005C. Lazy Narek 题解
    原题链接:https://codeforces.com/contest/2005/problem/C看了教程发现都是用dp做的,在这里分享一个差不多的SPFA的思路(赛场上忘了Dijkstra不能有负边所以炸了)时间复杂度与dp同样是O(nm)形式化题意和翻译:有n个长度为m的字符串,你可以选择或不选择来拼接它们,但是不能更改字符串的......
  • 食物链题解
    双倍经验:P2024[NOI2001]食物链当问题要求维护一些对立的关系时(朋友、敌人),就可以用种类并查集实现。因为有三种关系所以并查集的数组要开三倍空间,第一倍空间存同类关系,第二倍存捕食关系,第三倍存被捕食关系。注意:一的猎物的猎物就是一的天敌,其他就可以直接并查集维护即可。注......
  • [ABC371D] 1D Country 题解
    这题,怎么说呢,\(STL\)大法好。前置芝士:lower_pound函数在结构体上的使用。那其实这题便是一个二分前缀和的水题了。结构体存储每个村庄的距离\(x\),人口\(d\)。对于每个输入的\([l,r]\)二分查找其对应的村庄,进行一次答案的统计,输出即可。代码:#include<bits/stdc++.......
  • 【LGR-200-Div.4】洛谷入门赛 #27 A-H题解
    A#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;mt19937rnd(time(0));#defineintlonglongtypedeftuple<int,int,int>tp;#definexfirst#defineysecondtypedefpair<int,int>pii;typedefpair<double,double>......
  • 题解 [ABC371G] Lexicographically Smallest Permutation(中文/English)
    本题解提供英文版,位于示例代码之后。Englishversionofthiseditorialisprovidedafterthesamplecode.官方题解竟然用Python来算高精度lcm,我来提供一个可以避免一切大整数运算的方法。考察\(u\getsP_u\)这张图的每个置换环。为了使答案字典序最小,显然需要从前往后......
  • [安洵杯 2019]easy_web
    首先抓包可以看到img是一个base64编码依次经过base64,base64,asciihex解码得到一个图片名555.png那么我们可以利用这一点反过去看index.php的源码,修改头img=TmprMlpUWTBOalUzT0RKbE56QTJPRGN3最后经过base64解码后<?phperror_reporting(E_ALL||~E_NOTICE);header('con......