EOlymp 1976 Programming is an art! 题解

EOlymp 1976 Programming is an art! 题解


知识点

区间 DP。

分析

\(f_{l,r}\) 表示区间 \([l,r)\) 中最多颜色种类数,且这些颜色的区间被包含在 \([l,r)\) 中,即要求颜色 \(i\) 满足 \([L_i,R_i)\subseteq [l,r)\).

由于我们是求最多颜色种类数,每个颜色只需出现一次即可计入,那么我们每次枚举 \([l,r]\) 再选择一个满足 \([x,x+1)\subseteq [l,r)\) 的区间,尝试放入一个不可能在在 \(f_{l,x},f_{x+1,r}\) 中出现过的颜色即可。那么转移式就是:

\[f_{l,r} = \max_{x=l}^{r-1} (f_{l,x} + f_{x+1,r} + [\exist i,L_i\in [l,x]\land R_i \in [x+1,r]]) \\ \]

那么暴力枚举可以做到 \(O(n^4)\)(然后可能可以卡过去)。

考虑优化处理 \([\exist i,L_i\in [l,x]\land R_i \in [x+1,r]]\) 内的内容。发现只要记 \(mn_{l,r}\),表示:

\[mn_{l,r} = \min \{R_i |l\le L_i \land L_i \le r \land R_i > r \} \\ \]

然后简单判断一下,就可以把转移式变为:

\[f_{l,r} = \max_{x=l}^{r-1} (f_{l,x} + f_{x+1,r} + [mn_{l,x} \le r]) \\ \]

预处理可以做到 \(O(n^2)\),DP 总复杂度 \(O(n^3)\)

代码

constexpr int N(3e2+10),M(6e2+10);

int n,m;
int b[M],L[N],R[N];
int f[M][M],mn[M][M];

signed main() {
	/*DE("Input");*/
	I(n);
	FOR(i,1,n)I(L[i],R[i]);
	/*DE("Init");*/
	FOR(i,1,n)b[++m]=L[i],b[++m]=R[i];
	sort(b+1,b+m+1),m=unique(b+1,b+m+1)-b-1;
	FOR(i,1,n)L[i]=lower_bound(b+1,b+m+1,L[i])-b,R[i]=lower_bound(b+1,b+m+1,R[i])-b;
	FOR(l,1,m)FOR(r,l,m)mn[l][r]=INF;
	FOR(i,1,n)FOR(r,L[i],R[i]-1)tomin(mn[L[i]][r],R[i]);
	DOR(l,m-1,1)FOR(r,l+1,m)tomin(mn[l][r],mn[l+1][r]);
	/*DE("DP");*/
	FOR(len,2,m)for(int l(1),r(len); r<=m; ++l,++r)FOR(i,l,r-1)
		tomax(f[l][r],f[l][i]+f[i+1][r]+(mn[l][i]<=r));
	/*DE("Output");*/
	O(f[1][m],'\n');
	return 0;
}

posted @ 2025-09-04 20:50  Add_Catalyst  阅读(7)  评论(0)    收藏  举报