题意是找一堆时间点里面,不重合的时间段的最多个数。
经典的DP,让人想起刚刚入门时候的奶牛题。
从后往前的动归,这段核心代码写糊了,按教程理解了好久。
代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct Time
{
int star;
int end;
} time[101];
int cmp(const void *va, const void *vb)
{
Time *a,*b;
a=(Time*)va;
b=(Time*)vb;
if(a->star > b->star)
return 1;
if(a->star < b->star)
return -1;
return 0;
}
int main()
{
int n;
int ans[101];
while(scanf("%d", &n)!=EOF)
{
if(n==0)
break;
int max=0;
memset(ans,0,sizeof(ans));
for(int i=0; i<n; i++)
scanf("%d%d",&time[i].star,&time[i].end);
qsort(time, n, sizeof(Time),cmp);
//DP
for(int i=n-2; i >= 0; i--)
{
for(int j=i+1; j < n; j++)
{
//i次后可看的 && 除重复的情况
if(time[i].end <= time[j].star && ans[i] < ans[j]+1)
ans[i]=ans[j]+1;
if(max < ans[i])
max=ans[i];
}
}
printf("%d\n",max+1);//加上本身这一段
}
return 0;
}
本题也可以用贪心来做。