【arc074e】RGB Sequence(動態規劃)
阿新 • • 發佈:2018-09-27
href false rgb lin tor oid amp http for
【arc074e】RGB Sequence(動態規劃)
題面
atcoder
洛谷
翻譯見洛谷
題解
直接考慮暴力\(dp\),設\(f[i][j][k][l]\)表示當前考慮到第\(i\)位,最後一個紅綠藍色出現的位置是哪裏,發現顯然\(i=max(j,k,l)\),所以只有三維了,直接\(dp\)即可。至於限制每次在右端點考慮一下就好了。
#include<iostream> #include<cstdio> #include<vector> using namespace std; #define MAX 330 #define MOD 1000000007 inline int read() { int x=0;bool t=false;char ch=getchar(); while((ch<'0'||ch>'9')&&ch!='-')ch=getchar(); if(ch=='-')t=true,ch=getchar(); while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar(); return t?-x:x; } void add(int &x,int y){x+=y;if(x>=MOD)x-=MOD;} int n,m,f[MAX][MAX][MAX],ans; struct Node{int l,x;}; vector<Node> e[MAX]; bool check(int a,int b,int c) { int r=max(a,max(b,c)); for(int i=0,t=e[r].size();i<t;++i) { int l=e[r][i].l,x=e[r][i].x,s=0; s=(a>=l)+(b>=l)+(c>=l); if(s!=x)return false; } return true; } int main() { n=read();m=read(); for(int i=1;i<=m;++i) { int l=read(),r=read(),x=read(); e[r].push_back((Node){l,x}); } f[0][0][0]=1; for(int i=0;i<=n;++i) for(int j=0;j<=n;++j) for(int k=0;k<=n;++k) { if(!f[i][j][k])continue; if((i&&k&&i==k)||(i&&j&&i==j)||(j&&k&&j==k))continue; if(!check(i,j,k)){f[i][j][k]=0;continue;} int r=max(i,max(j,k)); add(f[r+1][j][k],f[i][j][k]); add(f[i][r+1][k],f[i][j][k]); add(f[i][j][r+1],f[i][j][k]); if(r==n)add(ans,f[i][j][k]); } printf("%d\n",ans); return 0; }
【arc074e】RGB Sequence(動態規劃)