http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1025
题意:给定一些stick,有一定长度和重量,现在 需要用最少的分组,实现任意一组中stick的长度和重量都不降 。
算法: DP+最长下降子序列(或贪心)。
分析:虽然是二维的比较,但是排个序就可以变二维的为一维的,可以证明最少不降序列覆盖数等于最长下降子序列的长度。
DP代码:
/*
Name: ZOJ_1025
Algorithm: DP+ 最长XX子序列
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAX 5001
#define max(a,b) (a>b?a:b)
using namespace std;
int T,n;
int dp[MAX] ;
struct Node{
int l,w;
friend bool operator < (const Node& a,const Node& b)
{
if(a.l == b.l) return a.w < b.w ;
else return a.l < b.l ;
}
}stick[MAX] ;
int main()
{
//freopen("1in.txt","r",stdin);
//freopen("1out.txt","w",stdout);
scanf("%d",&T);
int cnt ;
while(T--)
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d %d",&stick[i].l , &stick[i].w);
}
sort(stick,stick+n);
memset(dp,0,sizeof(dp));
dp[0] = 1 ;
int MAX_ = dp[0] ;
for(int i=1;i<n;i++)
{
int max_ = 1;
for(int j=0;j<i;j++)
{
if(stick[j].w > stick[i].w)
{
max_ = max(max_,dp[j]+1) ;
}
}
dp[i] = max_ ;
MAX_ = max(MAX_,dp[i]) ;
}
printf("%d\n",MAX_);
}
return 0;
}
本题类似于导弹拦截,只是这里是二维的,用上面的排序方面可以将二维的比较转化为一维的比较,因此可以用类似于导弹拦截的贪心思想。
贪心代码:
/*
Name: ZOJ_1025
Algorithm: 贪心
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAX 5001
#define max(a,b) (a>b?a:b)
using namespace std;
int T,n;
int max_len[MAX];
struct Node{
int l,w;
friend bool operator < (const Node& a,const Node& b)
{
if(a.l == b.l) return a.w < b.w ;
else return a.l < b.l ;
}
}stick[MAX] ;
int main()
{
//freopen("1in.txt","r",stdin);
//freopen("1out.txt","w",stdout);
scanf("%d",&T);
int cnt ;
while(T--)
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d %d",&stick[i].l , &stick[i].w);
}
sort(stick,stick+n);
cnt = 1;
max_len[1] = stick[0].w;
for(int i=1;i<n;i++)
{
int max_ = -1,max_n;
for(int j=1;j<=cnt;j++)
{
if(stick[i].w >= max_len[j])
{
if(max_ < max_len[j]) //每次贪心加载长度最长的后面
{
max_ = max_len[j] ;
max_n = j ;
}
}
}
if(max_ == -1) //此stick不能加在其他的后面,需要加一次时间
{
cnt ++ ;
max_len[cnt] = stick[i].w ;
}
else{
max_len[max_n] = stick[i].w ;
}
}
printf("%d\n",cnt);
}
return 0;
}