(蒟蒻的DP入门 03)洛谷P2782 友好城市(DP问题的预处理)

一、算法分析

所有DP类问题肯定都不是裸题放那里考,所以对DP类问题的解题关键也在于判断其能否用DP来做,以及如何将复杂问题分解为熟悉的类型(如线性DP、树上的DP等),比如这道题友好城市,A桥和B桥不相交的条件显然是两座桥的起点的相对位置和终点的相对位置是一致的,比如第一座桥起点在第二座桥起点的西边,那么第一座桥的终点也应该在第一座桥终点的西边。那么如何建最多的桥呢?这里就要把问题进行分解从而简化,我们可以将起点排序,这样从起点来看就不会发生冲突,那么冲突就只能发生在终点上,然后我们只要找终点的一个最长不下降子序列即可。

二、代码

using namespace std;
const int maxn=2e5+5;
struct line{
	int bg;
	int ed;
    line(int b,int e):bg(b),ed(e){}
};
bool cmp(line xx,line yy){
	if(xx.bg==yy.bg) return xx.ed<yy.ed;
	else return xx.bg<yy.bg;
}
vector<line> a;
int b[maxn][4];
int n;
ll c[maxn],f[maxn];
const ll inf=0x7fffffff; 
int main(){

	cin>>n;
	a.push_back(line(0,0));
	for(int i=1;i<=n;i++){
		int beg,edd;
		cin>>beg>>edd;
		a.push_back(line(beg,edd));
	}
	sort(a.begin()+1,a.end(),cmp);
	for(int i=1;i<=n;i++){
		c[i]=a[i].ed;
		f[i]=inf;
	} 
}

这是预处理的代码,之后只要求c数组的最长不下降子序列即可,注意要用nlogn算法。

发布了50 篇原创文章 · 获赞 7 · 访问量 1133

猜你喜欢

转载自blog.csdn.net/numb_ac/article/details/103567663