版权声明:希望能在自己成长的道路上帮到更多的人,欢迎各位评论交流 https://blog.csdn.net/yiqzq/article/details/82056664
原题地址:http://poj.org/problem?id=1065
题意:要处理n个长为li,宽为wi的木棍,若处理完(li, wi)后接着处理(li’, wi’)且满足li’ >= li, wi’ >= wi 则不花费时间,否则花费1单位时间,问处理完n根木棍最少花费多长时间。
思路;这题用dp来求解的话涉及到了离散中偏序集的知识,具体内容参考这篇博客
最长反链参考资料:http://vfleaking.blog.163.com/blog/static/1748076342012918105514527/
具体内容看代码:
#include <cmath>
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#include <vector>
#include <stack>
#include <set>
#include <map>
#define eps 1e-8
#define INF 0x3f3f3f3f
#define PI acos(-1)
#define lson l,mid,rt<<1
#define rson mid+1,r,(rt<<1)+1
#define CLR(x,y) memset((x),y,sizeof(x))
#define fuck(x) cerr << #x << "=" << x << endl
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int seed = 131;
const int maxn = 1e5 + 5;
const int mod = 1e9 + 7;
int t, n;
struct node {
int x, y;
bool operator <(const node &a)const {
if (x == a.x) return y < a.y;
else return x < a.x;
}
} e[maxn];
int dp[maxn];
int a[maxn];
int main() {
scanf("%d", &t);
while (t--) {
int len=1;
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d%d", &e[i].x, &e[i].y);
}
sort(e + 1, e + 1 + n);
for (int i = 1; i <= n; i++) {
a[i] = e[n - i + 1].y;
}
CLR(dp, 0x3f);
for (int i = 1; i <= n; i++) {
*lower_bound(dp , dp + n, a[i]) = a[i];
}
printf("%d\n", lower_bound(dp , dp + n, INF) - dp);
//// dp[1]=a[1];
//// for(int i=2;i<=n;i++){
//// if(dp[len]<a[i]) dp[++len]=a[i];
//// else {
//// int j=lower_bound(dp+1,dp+1+len,a[i])-dp;
//// dp[j]=a[i];
//// }
//// }
//// printf("%d\n",len);
}
return 0;
}
附上贪心代码:
#include <cmath>
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#include <vector>
#include <stack>
#include <set>
#include <map>
#define eps 1e-8
#define INF 0x3f3f3f3f
#define PI acos(-1)
#define lson l,mid,rt<<1
#define rson mid+1,r,(rt<<1)+1
#define CLR(x,y) memset((x),y,sizeof(x))
#define fuck(x) cerr << #x << "=" << x << endl
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int seed = 131;
const int maxn = 1e5 + 5;
const int mod = 1e9 + 7;
int t, n;
struct node {
int x, y;
bool operator <(const node &a)const {
if (x == a.x) return y < a.y;
else return x < a.x;
}
} e[maxn];
int a[maxn];
int vis[maxn];
int main() {
scanf("%d", &t);
while (t--) {
CLR(vis, 0);
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d%d", &e[i].x, &e[i].y);
}
sort(e + 1, e + 1 + n);
int ans = 0;
for (int i = 1; i <= n; i++) {
if (vis[i]) continue;
ans++;
vis[i] = 1;
int x = i;
for (int j = x + 1; j <= n; j++) {
if (e[j].y >= e[x].y && !vis[j]) {
x = j;
vis[j] = 1;
}
}
}
printf("%d\n", ans);
}
return 0;
}