POJ - 1631 Bridging signals DP(LIS)

传送门:POJ 1631

题意:这个题题意不好懂,不过看图就能明白了,就是让你去掉最少的线段,使得所有的线段都不想交。

思路:将线段用点对表示,左端点为一个递增的序列1,2,3....n,右端点是一个1-n的排列,不难发现在这样情况下若要不相交,则左端点比前面大的线段的右端点一定也比前面的线段大,即在右端点的排列中找一个最长的递增子序列,转化为LIS求解。

其实对着样例看也能看出是最长上升子序列的。

代码:

#include<stdio.h>
#include<algorithm>
#define inf 0x3f3f3f3f
using namespace std;
int a[50000], dp[50000];
int main()
{
	int T, n;
	scanf("%d", &T);
	while(T--)
	{
		scanf("%d", &n);
		for(int i = 0; i < n; i++)
		scanf("%d", a + i), dp[i] = inf;
		for(int i = 0; i < n; i++)
		*lower_bound(dp, dp + n, a[i]) = a[i];
		printf("%d\n", lower_bound(dp, dp + n, inf) - dp); 
	}
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值