zoukankan      html  css  js  c++  java
  • zoj 1107 FatMouse and Cheese(记忆化搜索)

    题目链接:点击链接

    题目大意:老鼠从(0,0)出发,每次在同一个方向上最多前进k步,且每次到达的位置上的数字都要比上一个位置上的数字大,求老鼠经过的位置上的数字的和的最大值

    #include<stdio.h>
    #include<string.h>
    #define max(a,b) a>b?a:b
    int n;
    int k;//前进的步数
    int map[105][105];
    int ans[105][105];//记忆化搜索,保存中间搜索结果
    int search(int x,int y)
    {
        int dx,dy;//要去的下一个位置
        int i,maxx = 0;
        if(ans[x][y] != -1) return ans[x][y];//已经搜索过,直接返回结果
        for(i = 1 ; i <= k ; i ++)//向前走的步数
        {
            dx = x - i;//向上
            if(dx >= 0 && dx < n && map[dx][y] > map[x][y])
            {
                ans[dx][y] = search(dx,y);
                maxx = max(maxx,ans[dx][y]);
            }
            dx = x + i;//向下
            if(dx >= 0 && dx < n && map[dx][y] > map[x][y])
            {
                ans[dx][y] = search(dx,y);
                maxx = max(maxx,ans[dx][y]);
            }
            dy = y - i;//向左
            if(dy >= 0 && dy < n && map[x][dy] > map[x][y])
            {
                ans[x][dy] = search(x,dy);
                maxx = max(maxx,ans[x][dy]);
            }
            dy = y + i;//向右
            if(dy >= 0 && dy < n && map[x][dy] > map[x][y])
            {
                ans[x][dy] = search(x,dy);
                maxx = max(maxx,ans[x][dy]);
            }
        }
        return maxx + map[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",&map[i][j]);
            memset(ans,-1,sizeof(ans));
            printf("%d
    ",search(0,0));
        }
        return 0;
    }


  • 相关阅读:
    应用安全-Web安全-越权漏洞整理
    操作系统
    接码平台 | 临时邮箱生成网站
    shell反弹/端口转发/端口映射/内网穿透/代理/SSH中转/TLS加密传输/协议转换/DNS防污染/抓包工具整理
    远控CVE整理
    Windows系统CVE整理
    https的了解
    软件设计师备考
    https资料
    基本感觉比较好的书
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3194083.html
Copyright © 2011-2022 走看看