AtCoder Regular Contest 074 E:RGB Sequence
阿新 • • 發佈:2018-12-08
三種 cst tps pps 當前 時間 ont vector 約束 即可。因為三種顏色沒有本質區別,所以我們印點\(i>j>k\)。
題目傳送門:https://arc074.contest.atcoder.jp/tasks/arc074_c
題目翻譯
給你一行\(n\)個格子,你需要給每個格子填紅綠藍三色之一,並且同時滿足\(m\)個約束。每個約束由\(l,r,x\)來形容,表示\(l\)到\(r\)之間的所有格子顏色種數必須為\(x\),求方案數。\(n,m\leqslant 300\)
題解
設\(f[i][j][k]\)表示當前已經塗到了\(x=max\){\(i,j,k\)},最後一個紅色格子在\(i\),最後一個綠色格子在\(j\),最後一個藍色格子在\(k\)並且凡是\(r\)小於等於當前格子的約束都滿足的方案數。直接轉移到\(f[x+1][j][k],f[i][x+1][k],f[i][j][x+1]\)
時間復雜度:\(O(n^3+n^2*m)\)
空間復雜度:\(O(n^3)\)
代碼如下:
#include <cstdio> #include <vector> #include <algorithm> using namespace std; typedef pair<int,int>pii; const int pps=1e9+7; int n,m,ans; vector<pii>q[305]; int f[305][305][305]; vector<pii>::iterator it; int read() { int x=0,f=1;char ch=getchar(); for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1; for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0'; return x*f; } int main() { n=read(),m=read(); for(int i=1;i<=m;i++) { int l=read(),r=read(),x=read(); q[r].push_back(make_pair(l,x)); }f[0][0][0]=1; for(int i=1;i<=n;i++) { for(int j=0;j<i;j++) for(int k=0;k<=j;k++) {//<=是因為j,k可以全部等於0 f[i][j][k]=(f[i][j][k]+f[i-1][j][k])%pps; f[i][i-1][k]=(f[i][i-1][k]+f[i-1][j][k])%pps; f[i][i-1][j]=(f[i][i-1][j]+f[i-1][j][k])%pps; for(it=q[i].begin();it!=q[i].end();it++) { int tmp=(j>=(*it).first)+(k>=(*it).first)+1; if(tmp!=(*it).second)f[i][j][k]=0; } } } for(int i=0;i<n;i++) for(int j=0;j<=i;j++) ans=(ans+f[n][i][j])%pps; printf("%d\n",ans); return 0; }
AtCoder Regular Contest 074 E:RGB Sequence