HDU 1078FatMouse and Cheese(记忆化搜索)

来源:互联网 发布:linux 中文man手册 编辑:程序博客网 时间:2024/06/18 14:35

题意:老鼠从(0,0)点走,每次最多可以走k步(只能水平或垂直地走),且下一个点的价值比当前点的价值大。求他得到的价值最大为多少。

#include <iostream>#include <queue>#include <stdio.h>#include <math.h>#include <algorithm>#include <vector>#include <map>#include <set>#include <string.h>#include <string>using namespace std;#define maxn 105#define inff 0x7FFFFFFint maz[maxn][maxn],dp[maxn][maxn];int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};int n,k;int dfs(int x,int y){    int maxx=0;    if(!dp[x][y])    {        for(int i=1;i<=k;i++)        {            for(int j=0;j<4;j++)            {                int tx=x+dir[j][0]*i;                int ty=y+dir[j][1]*i;                if(tx<=n&&tx>=1&&ty>=1&&ty<=n&&maz[x][y]<maz[tx][ty])                {                    int temp=dfs(tx,ty);                    maxx=max(temp,maxx);                }            }        }        dp[x][y]=maxx+maz[x][y];    }    return dp[x][y];}int main(){    int i,j;    while(scanf("%d%d",&n,&k)!=EOF)    {        if(n==-1&&k==-1)            return 0;        for(i=1;i<=n;i++)        {            for(j=1;j<=n;j++)            {                scanf("%d",&maz[i][j]);            }        }        memset(dp,0,sizeof dp);        int ans=dfs(1,1);        cout<<ans<<endl;    }    return 0;}


0 0
原创粉丝点击