记录编号 252308 评测结果 AAAAAAA
题目名称 [NOI 1998]免费馅饼 最终得分 100
用户昵称 Gravatar安呐一条小咸鱼。 是否通过 通过
代码语言 C++ 运行时间 0.090 s
提交时间 2016-04-20 07:58:08 内存使用 10.97 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct Bing
{
	int timb,loca,v,fen,timee;
}bing[3001];
int C[1001][1001],f[1001][1001];
bool Q[1001][1001];
int road[1001][1001]; 
int W,H;
int move[5]={2,1,0,-1,-2};//储存可以移动的步数; 
int _max(int a,int b){return a>b?a:b;}
void Road(int a,int b)
{
	if(road[a][b]==88888888)return;
	
	Road(a-1,b+road[a][b]);
	cout<< -road[a][b] <<endl;
}
int main()
{
	freopen("freepizza.in","r",stdin); 
	freopen("freepizza.out","w",stdout);
	memset(C,0,sizeof(C));
	memset(f,0,sizeof(f));
	memset(Q,0,sizeof(Q));
	memset(road,88888888,sizeof(road));
	for(int i=0;i<1001;i++)
	{
		for(int j=0;j<1001;j++)
		{
			road[i][j]=88888888;
		}
	}
	scanf("%d%d",&W,&H);
	int len=1;
	if(W==1&&H!=21)
	{
		int aws=0;
		while(scanf("%d%d%d%d",&bing[len].timb,&bing[len].loca,&bing[len].v,&bing[len].fen)!=EOF)
		{
			aws+=bing[len].fen;
		}
		printf("%d\n0",aws);
		return 0;
	}
	int T=-1;//记录T的最大值 用来判断和Dp; 
	while(scanf("%d%d%d%d",&bing[len].timb,&bing[len].loca,&bing[len].v,&bing[len].fen)!=EOF)
	{
		//cout<<bing[len].timb<<" "<<bing[len].loca<< " "<<bing[len].v<<" "<<bing[len].fen<<" "<<len<<endl;
	//	bing[len].timee=(H-1)/bing[len].v;
	//	C[ bing[len].loca ][ bing[len].timb+bing[len].timee ]=bing[len].fen;
	//	T=_max(bing[len].timb+bing[len].timee,T);
		if((H-1)%bing[len].v==0||H==1)
		{
			C[bing[len].timb+ (H-1)/bing[len].v ][ bing[len].loca ]+=bing[len].fen;
		//	C[bing[len].timb+(H-1)/bing[len].v][ len ]+=bing[len].fen;
			T=_max(bing[len].timb+(H-1)/bing[len].v,T);
		}
		len++;
	}
	if(len==1 || T==-1 )
	{
		puts("0");
		return 0;	
	}
	Q[0][W/2+1]=1;//人的位置; 
	int maxx=-1;
	int road1=0,road2=0;//记录前驱; 
	for(int i=1;i<=T;i++)
	{
		for(int j=1;j<=W;j++)//现在的坐标为:"j+move[k]"
	    {
	    	for(int k=0;k<=4;k++)//路径; 
			{
				if( j+move[k]>=1 && j+move[k]<=W && Q[i-1][j+move[k]]==true && f[i][j]<=f[i-1][j+move[k]]+C[i][j] )
				{
					Q[i][j]=true;
					road[i][j]=move[k];
					f[i][j]=f[i-1][ j+move[k] ]+C[i][j];	
				//	maxx=_max( f[i][j],maxx );
					if(maxx<=f[i][j])
					{
						maxx=f[i][j];
						road1=i;
						road2=j;
					}
				}			
			}
	    }
	}
	cout<<maxx<<endl;
/*	for(int i=1;i<T;i++)
	{
		cout<<endl;
		for(int j=1;j<=W;j++)
	    {
	    	cout<<-road[i][j]<<" ";
	    }
	}*/
	//while(1);
	
	Road(road1,road2);
	
//	return 0;
//	for(int i=1;i<=len;i++)
//	{
//		cout<<bing[i].timb<<" "<<bing[i].loca<< " "<<bing[i].v<<" "<<bing[i].fen<<" "<<i<<endl;
//	}
}