bzoj2298 [HAOI2011]problem a
题解
考虑到每个人说的话可以锁定一个区间内的成绩是相同的。所以问题就转化成了给定一些有权值的区间,要求选出若干无交集区间使其权值和最大, $\text{dp}$ 即可。
代码
#include <bits/stdc++.h> using namespace std; int n,m,f[100005]; struct O{int l,r;}g[100005]; bool cmp(O A,O B){ return A.r==B.r?A.l<B.l:A.r<B.r; } int main(){ cin>>n; for (int i=1,l,r;i<=n;i++){ scanf("%d%d",&l,&r); l++;r=n-r;if (l>r) continue; g[++m]=(O){l,r}; } sort(g+1,g+m+1,cmp); for (int i=1,j=0,l,r,k=0;i<=m;i=j+1){ l=g[i].l;r=g[i].r; while(k<r) f[k+1]=f[k],k++; while(j<m && g[j+1].l==l && g[j+1].r==r) j++; f[r]=max(f[r],f[l-1]+min(r-l,j-i)+1); } cout<<n-f[n]<<endl;return 0; }