zoukankan      html  css  js  c++  java
  • HDU-1078 FatMouse and Cheese

    时间限制 1000ms 空间限制 32768KB

    题目:

    FatMouse has stored some cheese in a city. The city can be considered as a square grid of dimension n: each grid location is labelled (p,q) where 0 <= p < n and 0 <= q < n. At each grid location Fatmouse has hid between 0 and 100 blocks of cheese in a hole. Now he's going to enjoy his favorite food.

    FatMouse begins by standing at location (0,0). He eats up the cheese where he stands and then runs either horizontally or vertically to another location. The problem is that there is a super Cat named Top Killer sitting near his hole, so each time he can run at most k locations to get into the hole before being caught by Top Killer. What is worse -- after eating up the cheese at one location, FatMouse gets fatter. So in order to gain enough energy for his next run, he has to run to a location which have more blocks of cheese than those that were at the current hole.

    Given n, k, and the number of blocks of cheese at each grid location, compute the maximum amount of cheese FatMouse can eat before being unable to move.

    输入:

    There are several test cases. Each test case consists of

    a line containing two integers between 1 and 100: n and k
    n lines, each with n numbers: the first line contains the number of blocks of cheese at locations (0,0) (0,1) ... (0,n-1); the next line contains the number of blocks of cheese at locations (1,0), (1,1), ... (1,n-1), and so on.
    The input ends with a pair of -1's.

    输出:

    For each test case output in a line the single integer giving the number of blocks of cheese collected.

    样例输入:

    3 1

    1 2 5

    10 11 6

    12 12 7

    -1 -1

    样例输出:

    37

    题意:

    给出一个n,这里有一个n*n的地图,每一个点都有奶酪值,奶酪值得大小表示奶酪得多少,现在有一只老鼠站在(1,1)这个位置,给定一个k,代表它可以一次向着一个方向走1到k步,要使得他每次走的地方得奶酪值比以前得奶酪值多,问他能最多获得多少奶酪。

    思路:

    用dfs搜索,除了边界得点每一个点都可以向着四个方向走,每一次可以走一到k步,用dfs和记忆化搜索就能完成,走过的地方标记一下,这样就可以节省时间提高效率.

    AC代码:

    #include<iostream>
    #include<cstring>
    using namespace std;
    int b[4][2]={0,1,1,0,0,-1,-1,0};
    int a[105][105],dp[105][105];
    int n,k;
    int dfs(int l,int r)
    {
        if(dp[l][r]!=-1)
            return dp[l][r];
            int Max=0;
        for(int i=0;i<4;i++)
            for(int j=1;j<=k;j++)
            {
                int xx=l+b[i][0]*j;
                int yy=r+b[i][1]*j;
                if(xx>=0&&xx<n&&yy>=0&&yy<n&&a[xx][yy]>a[l][r])
                {
                    int s=dfs(xx,yy);
                    if(s>Max)
                        Max=s;
                }
            }
            dp[l][r]=Max+a[l][r];
            return dp[l][r];
    }
    int main()
    {
        while(cin>>n>>k)
        {
            memset(dp,-1,sizeof(dp));
            if(n==-1&&k==-1)
                break;
            for(int i=0;i<n;i++)
                for(int j=0;j<n;j++)
                cin>>a[i][j];
            dfs(0,0);
            cout<<dp[0][0]<<endl;
        }
    }
  • 相关阅读:
    比较实用的免费图标字库(转)
    聊聊 cursor鼠标样式
    (转)3款优秀的移动webAPP网站在线测试工具
    常用meta整理
    (转)SVN搭建(附下载地址)
    (转)C#串口SerialPort常用属性方法
    加载信息,先从数据库取出5条实现分页,鼠标向上滑动触发Ajax再加载5条,达到异步刷新,优化加载。。。
    图片上传,获取路径以及下载功能
    Mysql事务,并发问题,锁机制
    app中Webview实现下载表格
  • 原文地址:https://www.cnblogs.com/Leozi/p/13281238.html
Copyright © 2011-2022 走看看