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;
        }
    }
  • 相关阅读:
    关于JAVA中RSA加签解签,私钥加密公钥解密和公钥加密私钥解密代码详解
    Vue使用总结
    使用ReflectionToStringBuilder实现toString方法
    vue 发送短信验证码倒计时
    个人信息打码
    Token注解防止表单的重复提交
    html选择图片后直接预览
    从分布式一致性谈到CAP理论、BASE理论
    node.js 下依赖Express 实现post 4种方式提交参数
    web前端学习笔记(CSS变化宽度布局)
  • 原文地址:https://www.cnblogs.com/Leozi/p/13281238.html
Copyright © 2011-2022 走看看