一开始用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; } }