您的位置:首页 > 其它

2650: 礼物

2010-07-10 21:09 155 查看
2650: 礼物

ResultTIME LimitMEMORY LimitRun TimesAC TimesJUDGE

3s8192K15326Standard
10*10的格子(1,1)-(10,10)。一个人开始(0秒)站在(1,1)点。每秒他最多可以移动v个格子(但是只能是上下左右,不可以斜着移动)。每一秒钟,天空中会有礼物落下来。当这个人这一秒移动结束后停在某一个格子中,他就可以得到这一秒落到这个格子里的所有礼物。时间一共有t秒。由于礼物的价值是不同的。他想让收集到的礼物价值和最大。请你编程输出他所得到礼物价值和的最大值。

Input

多组输入,每组如下:

第一行v,t,m。表示每秒最多移动v个格子,时间共t秒(1 <=t <= 100),一共会落下m件礼物。

以下m行每行为time,x,y,c。表示在time秒(1<=time<=t),(x,y)格子会有价值为c(正整数)的礼物落下。 v=t=m=0表示输入结束,你不必处理此行。

Output

每组一行,一个整数表示得到礼物的最大价值。

Sample Input

9 2 2
1 1 1 10
2 10 10 100
0 0 0

Sample Output

100


This problem is used for contest: 160

#include<stdio.h>
#include<string.h>
int v,t,m;
int a[150][15][15],val[150][15][15];
int abs(int x){ return x>0?x:-x;}
int dfs(int t,int x,int y)
{
if(a[t][x][y]!=-1) return a[t][x][y];
// printf("t::::%d x:::::%d y::::%d/n",t,x,y);
// printf("****val[t][x][y]%d a[t][x][y]%d/n",val[t][x][y],a[t][x][y]);
int i,j,k,xx,yy;
if(t==1)
{
if(abs(x-1)+abs(y-1)<=v) return val[1][x][y];
else return -123456789;
}
int max=1<<31;
for(xx=1;xx<=10;xx++)
{
for(yy=1;yy<=10;yy++)
{
if(abs(xx-x)+abs(yy-y)<=v)
{
int temp=dfs(t-1,xx,yy);
if(temp>max) max=temp;
}
}
}
a[t][x][y]=max+val[t][x][y];
// printf("%d>>>>>/n",a[t][x][y]);
return a[t][x][y];
}
int main()
{
int i,j,k;
while(scanf("%d%d%d",&v,&t,&m)==3,v||t||m)
{
memset(a,-1,sizeof(a));
memset(val,0,sizeof(val));
for(i=0;i<m;i++)
{
int q,w,e,r;
scanf("%d%d%d%d",&q,&w,&e,&r);
val[q][w][e]+=r;
}
int max=0;
//printf("%d../n",dfs(t,10,10));
for(k=1;k<=t;k++) for(i=1;i<=10;i++) for(j=1;j<=10;j++)
{
if(dfs(k,i,j)>max) max=dfs(k,i,j);
}
printf("%d/n",max);
}
return 0;
}
/*
2 3 3
1 1 1 10
2 2 2 50
3 10 10 1000
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: