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;
        }
    }
  • 相关阅读:
    受益一生的15个学习习惯
    如何在工作的头三年里让自己变得强大
    linux定时执行脚本
    SpringMVC基础入门
    Spring与Quartz的整合实现定时任务调度[转]
    强肝保肝养肝4大食物
    Spring官网jar包下载方法
    tomcat管理端的页面安全措施
    Struts2 Action 动态传参数
    Java之控制反转和依赖注入
  • 原文地址:https://www.cnblogs.com/Leozi/p/13281238.html
Copyright © 2011-2022 走看看