hdu1078FatMouse and Cheese

一开始用map+max作为返回值,答案是对的,超时了,因为一些格子原先算过了,后来再用到它时,又得算它的值,所以超时了

用p来表示它的范围,没有*i,所以错了

用mark来表示从边走到它这里要的的最大权重和,第一次把mark放到if外面,结果,当mark不是0时,mark又变回map+max了,所以错了,把它放到if里面,ACCEPT了

#include "iostream"
#include "string.h"
using namespace std;
int p[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int n,k,map[110][110],mark[110][110];

int dfs(int x,int y){
  int max=0,i,j,xx,yy,pos=mark[x][y];
  if(pos==0){     //
   for(i=1;i<=k;i++){
    for(j=0;j<4;j++){
      xx=x+p[j][0]*i;  //
      yy=y+p[j][1]*i;
      //cout<<"xx "<<xx<<" yy "<<yy<<endl;
      if(xx>=0&&xx<n&&yy>=0&&yy<n&&map[xx][yy]>map[x][y]){  //
        int ans=dfs(xx,yy);
        max=max>ans?max:ans;
      }
    }
   }
    mark[x][y]=map[x][y]+max;//
  }
  //cout<<"mark[x][y] "<<mark[x][y]<<endl;
  //cout<<"x "<<x<<" y "<<y<<endl;
  return mark[x][y];
}

int main(){
  int i,j;
  while(1){
    cin>>n>>k;
    if(n==-1&&k==-1)break;
    memset(mark,0,sizeof(mark));
    for(i=0;i<n;i++){
      for(j=0;j<n;j++)
      cin>>map[i][j];
    }
    cout<<dfs(0,0)<<endl;
  }
}

 

posted @ 2013-08-22 17:17  龙城星  阅读(162)  评论(0编辑  收藏  举报