Processing math: 100%

【ARC074e】RGB sequence

Description

  
​   一排n个格子,每个格子可以涂三种颜色的一种。现在给出m个形如“[l,r]中必须恰好有x种颜色"的限制(1lrn,1x3)。
  
​   求一共有多少种满足所有限制的合法涂色方案。
  
​   答案对109+7取模。
    
  
  

Solution

  
​   首先要想到状态表示法,如何表示才能适应这些限制呢?由于是限制颜色种类数,可以考虑最早出现位置这类套路。
  
​   设fi,j,k表示:当前走完1...i,在i左边最靠右的、与i颜色不同的位置为j,在j左边最靠右的、与ij颜色不同的位置为k时,目前合法染色方案数是多少。
  
​   逐步计算f1,f2,...
  
​   接下来考虑限制。考虑在转移的时候逐一枚举限制来判断新状态是否合法。
    
​   则总复杂度是O(n3m)的。还有3倍常数,显然不够优秀。
  
​   然而这只是臆想做法,具体我也没实现出来,因为枚举限制的时候,限制的区间和i,j,k的位置的关系实在太多,不好写。
  
​   实际上,对于一个[l,r]的限制,它只需要去管i==r的那些状态是否合法即可。如果i<r,那么显然还没有考虑的必要(都没填完[l,r],考虑什么呢?)。如果r<i那么已经晚了。所以每个条件至多被枚举一次。
  
​   因此总复杂度是O(n2(n+m))的。
  
​   所以下次觉得枚举限制条件十分复杂且时间复杂度爆炸的时候,不妨想一想限制条件或许只针对特定对象才起效果或必要,这样就可以减少总枚举次数,优化复杂度。
  
​  
  
  
  

Code

  

#include <cstdio>
#include <algorithm>
#include <vector>
#define pb push_back
#define mp make_pair
using namespace std;
typedef pair<int,int> pii;
const int N=310;
const int MOD=1e9+7;
int n,m;
int f[N][N][N];
vector<pii> lis[N];
void readData(){
	scanf("%d%d",&n,&m);
	int l,r,x;
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&l,&r,&x);
		lis[r].pb(mp(l,x));
	}
}
void dp(){
	f[1][0][0]=1;
	for(int i=1;i<=n;i++){
		for(int d=0,sz=lis[i].size();d<sz;d++){
			int l=lis[i][d].first,x=lis[i][d].second;
			for(int j=0;j<i;j++)
				for(int k=0;k<=(j-(j>0));k++){
					if(x==1){
						if(l<=j) f[i][j][k]=0;
					}
					else if(x==2){
						if(l<=k||j<l) f[i][j][k]=0;
					}
					else{
						if(k<l) f[i][j][k]=0;
					}
				}
		}
		if(i==n) break;
		for(int j=0;j<i;j++)
			for(int k=0;k<=(j-(j>0));k++)
				if(f[i][j][k]){
					(f[i+1][j][k]+=f[i][j][k])%=MOD;	
					(f[i+1][i][k]+=f[i][j][k])%=MOD;
					(f[i+1][i][j]+=f[i][j][k])%=MOD;
				}
	}
	int ans=0;
	for(int j=0;j<n;j++)
		for(int k=0;k<=(j-(j>0));k++)
			(ans+=f[n][j][k])%=MOD;
	ans=1LL*ans*3%MOD;
	printf("%d\n",ans<0?ans+MOD:ans);
}
int main(){
	readData();
	dp();
	return 0;
}

posted @   RogerDTZ  阅读(197)  评论(0编辑  收藏  举报
编辑推荐:
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
阅读排行:
· 如何给本地部署的DeepSeek投喂数据,让他更懂你
· 超详细,DeepSeek 接入PyCharm实现AI编程!(支持本地部署DeepSeek及官方Dee
· 用 DeepSeek 给对象做个网站,她一定感动坏了
· .NET 8.0 + Linux 香橙派,实现高效的 IoT 数据采集与控制解决方案
· .NET中 泛型 + 依赖注入 的实现与应用
历史上的今天:
2017-08-14 【2016北京集训测试赛(八)】 crash的数列 (思考题)
2017-08-14 【2016北京集训测试赛(八)】 直径 (虚树+树的直径)
点击右上角即可分享
微信分享提示