您的位置:首页 > 其它

HDOJ 2037 今年暑假不AC解题报告

2011-07-31 21:27 459 查看
//#include <fstream>
#include <memory>
#include <algorithm>
#include<iostream>
using namespace std;
struct Program
{
int start;
int end;
};
int cmp( const void *a , const void *b )
{
struct Program *c = (Program *)a;
struct Program *d = (Program *)b;
if(c->start >d->start) return 1;
else if(c->start <d->start) return -1;
else return 0;
}
int MaxLength(int len,int* traceLength,int* trace,Program* p)
{
qsort(p,len,sizeof(Program),cmp);
int max=0;
for(int i=1;i<len;i++)
{
for(int temp=0;temp<i;temp++)
{
if(p[i].start>=p[temp].end)
{
if(traceLength[i]<traceLength[temp])
{
trace[i]=temp;
traceLength[i]=traceLength[temp];
}
}
}
traceLength[i]++;
if(traceLength[i]>traceLength[max])
max=i;

}
return max;
}
int main()
{
//fstream cin("今年暑假不AC.txt");
int len=0;
while(cin>>len)
{
if(len==0)
break;
int* trace=new int[len];
int* traceLength=new int[len];
memset(traceLength,0,sizeof(int)*len);
traceLength[0]=1;
Program* program=new Program[len];
for(int i=0;i<len;i++)
cin>>program[i].start>>program[i].end;
int pos=MaxLength(len,traceLength,trace,program);
cout<<traceLength[pos]<<endl;
}
return 0;
}

总结与教训:

1、使用动态规划解题,直接将区间以开始点排序,然后将不重叠的点的最大值+1以记录就可以了。直接在循环中记录了最大点,更简洁。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  struct c