zoj 1107 FatMouse and Cheese

/*
zoj_1107    dp
记忆化搜索的典例。

注意点:
1.bfs是会MLE的
2.题意中的最多k步是只垂直或者只水平的。
*/
#include <iostream>
#include <cstdio>
#include <limits.h>
#include <string.h>
#include <queue>
using namespace std;
int v[110][110],dp[110][110];
int ope[4][2]={ 0,1,0,-1,1,0,-1,0 };
int n,k;

int sear( int x,int y )
{
    int i,j,t,xx,yy,maxi;
    if( dp[x][y]!=-1 )  return dp[x][y];
    dp[x][y]=v[x][y];
    maxi=-1;
    for( i=1;i<=k;i++ )
        for( j=0;j<4;j++ )
        {
            xx=x+i*ope[j][0];   yy=y+i*ope[j][1];
            if( xx>=0 && xx<n && yy>=0 && yy<n && v[xx][yy]>v[x][y] )
                if( maxi<( t=bfs(xx,yy)+v[x][y] ) )
                    maxi=t;
        }
    if( maxi!=-1 )  dp[x][y]=maxi;
    return dp[x][y];
}

int main()
{
    int i,j;
    while( scanf( "%d%d",&n,&k ) && !( n==-1 && k==-1 ) )
    {
        for( i=0;i<n;i++ )
            for( j=0;j<n;j++ )
            {
                scanf( "%d",&v[i][j] );
                dp[i][j]=-1;
            }
        printf( "%d\n",sear( 0,0 ) );
    }
    return 0;
}

你可能感兴趣的:(zoj 1107 FatMouse and Cheese)