[ARC074E] RGB Sequence
好题,记录一下。
首先若干个区间限制,根据套路,我们只在右端点统计信息。
因为只有三种颜色,再看数据范围,可以考虑三维 dp。
设
然后我们可以很方便的判断该状态是否合法,若合法则刷表法更新信息。
为什么用刷表法?这样做的好处是我们的
转移方程比较显然,分
最后答案记得
#include<bits/stdc++.h>
using namespace std;
#define rd read()
#define PII pair<int,int>
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define ll long long
#define FOR(i,j,k) for(int i=j;i<=k;i++)
#define ROF(i,j,k) for(int i=j;i>=k;i--)
int read(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)) x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
return x*f;
}
const int N=310,mod=1e9+7;
int MOD(int x){return x>=mod?x-mod:x;}
int n,m,f[N][N][N];
vector<PII> v[N];
int main(){
n=rd,m=rd;FOR(i,1,m){int l=rd,r=rd,x=rd;v[r].pb(mp(l,x));}
f[1][0][0]=1;
FOR(i,1,n){
for(auto t:v[i]){
int l=t.fi,x=t.se;
FOR(j,0,i-1){
FOR(k,0,max(0,j-1)){
if(x==1){if(l<=j) f[i][j][k]=0;}
else if(x==2){if(j<l||l<=k) f[i][j][k]=0;}
else if(x==3){if(k<l) f[i][j][k]=0;}
}
}
}
if(i==n) break;
FOR(j,0,i-1) FOR(k,0,max(0,j-1)){
if(!f[i][j][k]) continue;
f[i+1][j][k]=MOD(f[i+1][j][k]+f[i][j][k]);
f[i+1][i][k]=MOD(f[i+1][i][k]+f[i][j][k]);
f[i+1][i][j]=MOD(f[i+1][i][j]+f[i][j][k]);
}
}
int ans=0;
FOR(j,0,n) FOR(k,0,max(0,j-1)) ans=MOD(ans+f[n][j][k]);
ans=3ll*ans%mod;
printf("%d\n",ans);
return 0;
}
分类:
动态规划(dp)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现