题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=25
题目大意:锯木桩,每次小于前面开过机的长和厚不用建立,大于的话就得重新发动,发动时间为1,为求最小发动世界。
先快排(从大到小),在求下降子序列。
先快排(从小到大),再求有几个连续上升子序列,下面代码按这种做法做
代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<iostream>
using namespace std;
#pragma warning(disable:4996)
struct node
{
int l, w;
}data[2600];
bool cmp(struct node x, struct node y)
{
if (x.l != y.l)
return x.l < y.l;
else
return x.w < y.w;
}
int b[2060];
int n;
int LIS()
{
memset(b, 0, sizeof(b));
b[0] = 1;
int i, j;
for (i = 1; i < n; i++)
{
int k = 0;
for (j = 0; j < i; j++)
if (data[i].w < data[j].w && k < b[j])
k = b[j];
b[i] = k + 1;
}
int max = b[0];
for (i = 1; i < n; i++)
{
if (max < b[i])
max = b[i];
}
return max;
}
int main()
{
int T;
scanf("%d", &T);
while (T--)
{
//int n;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d%d", &data[i].l, &data[i].w);
}
sort(data, data + n, cmp);
printf("%d\n", LIS());
}
//system("pause");
return 0;
}