NWERC 2015B/bzoj 4426 Better Productivity

#include<bits/stdc++.h>
#define N 210
using namespace std;
struct Node{int x,y;}a[N],b[N],c[N];
int dp[N][N];
int n,p,B,C;
inline bool cmp1(Node a,Node b){
	if(a.x!=b.x) return a.x<b.x;
	return a.y<b.y;
}
inline bool cmp2(Node a,Node b){
	return a.y-a.x>b.y-b.x;
}
int main(){
	scanf("%d%d",&n,&p);
	for(int i=0;i<n;i++) scanf("%d%d",&a[i].x,&a[i].y);
	for(int i=0;i<n;i++){
		int f=0;
		for(int j=0;j<n;j++){
			if(i==j) continue;
			if(a[i].x==a[j].x&&a[j].y==a[i].y){
				if(i>j) continue;
			}
			if(a[i].x<=a[j].x&&a[j].y<=a[i].y) f=1;
		}
		if(f) b[B++]=a[i];
		else c[++C]=a[i];
	}
	sort(b,b+B,cmp2);
	sort(c+1,c+C+1,cmp1);
	int bes=0;
	for(int i=0;i<=p;i++)
		for(int j=0;j<=C;j++)
			dp[j][i]=-1008610086;
	dp[0][0]=0;
	for(int k=1;k<=p;k++){
		for(int i=1;i<=C;i++){
			for(int j=1;j<=i;j++){
				if(c[j].y-c[i].x<=0) continue;
				dp[i][k]=max(dp[i][k],dp[j-1][k-1]+c[j].y-c[i].x);
			}
		}
	}
	for(int l=0;l<=p;l++){
		int ans=0;
		for(int j=0;j<l;j++) ans+=b[j].y-b[j].x;
		bes=max(bes,dp[C][p-l]+ans);
	}
	printf("%d\n",bes);
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章