2650: 礼物
2010-07-10 21:09
155 查看
2650: 礼物
10*10的格子(1,1)-(10,10)。一个人开始(0秒)站在(1,1)点。每秒他最多可以移动v个格子(但是只能是上下左右,不可以斜着移动)。每一秒钟,天空中会有礼物落下来。当这个人这一秒移动结束后停在某一个格子中,他就可以得到这一秒落到这个格子里的所有礼物。时间一共有t秒。由于礼物的价值是不同的。他想让收集到的礼物价值和最大。请你编程输出他所得到礼物价值和的最大值。
第一行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表示输入结束,你不必处理此行。
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
*/
Result | TIME Limit | MEMORY Limit | Run Times | AC Times | JUDGE |
---|---|---|---|---|---|
3s | 8192K | 153 | 26 | Standard |
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
*/