比赛 20120413 评测结果 AAAAAAAAAA
题目名称 滑雪训练 最终得分 100
用户昵称 QhelDIV 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2012-04-13 21:59:31
显示代码纯文本
/*
ID:alertya1
PROG:ski
LANG:C++
*/
#include <fstream>
#include <cstdlib>
using namespace std;
ifstream fin("ski.in");
ofstream fout("ski.out");
int T,S,N,Max_T,road[20005],Max;bool flag[13005][105],Record[20005];
class Le
{
public:
	int St,last,lev,Data;
}Lesson[202],f[13005][205];
void Initialize()
{
int i,St_init,En_init;
	fin>>T>>S>>N;
	for(i=1;i<=S;i++)
	{
		fin>>Lesson[i].St>>Lesson[i].last>>Lesson[i].lev;
		Max_T=max(Max_T,Lesson[i].lev);
		Record[Lesson[i].St]=true;
	}
	for(i=1;i<=N;i++)
	{
		fin>>En_init>>St_init;
		Max_T=max(Max_T,En_init);
		if(road[En_init]==0 || road[En_init]>St_init)
			road[En_init]=St_init;
	}
	for(i=1;i<=Max_T;i++)
		if(road[i-1]!=0)
			if(road[i]!=0)
				road[i]=min(road[i],road[i-1]);
			else
				road[i]=road[i-1];
}

void dp()
{
int i,j,k;
	flag[0][1]=true;
	for(i=0;i<=T;i++)
	{
		for(j=1;j<=Max_T;j++)
			if(flag[i][j])
			{
				flag[i+1][j]=true;f[i+1][j].Data=max(f[i][j].Data,f[i+1][j].Data);
				if(road[j])
				{
					flag[i+road[j]][j]=true;
					f[i+road[j]][j].Data=max(f[i+road[j]][j].Data,f[i][j].Data+1);
				}
				if(Record[i])
					for(k=1;k<=S;k++)
						if(Lesson[k].St==i)
						{
							f[i+Lesson[k].last][Lesson[k].lev].Data=max(f[i+Lesson[k].last][Lesson[k].lev].Data,f[i][j].Data);
							flag[i+Lesson[k].last][Lesson[k].lev]=true;
						}
		Max=max(f[i][j].Data,Max);
			}
	}
	fout<<Max<<endl;
}

int main()
{
	Initialize();
	
	dp();
	
	fin.close();
	fout.close();
	return 0;
}