zoukankan      html  css  js  c++  java
  • hdu1078(记忆化搜索)

    题意:给出n*n的格子,每个各自里面有些食物,问一只老鼠每次走最多k步所能吃到的最多的食物

    这道题目,值得我记住它,re了n次,以前写搜索没有注意的一个小地方,导致re这么多次的

    ac代码:

    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    using namespace std;
    int dp[110][110],s[110][110];
    int n,k,t[4][2]={1,0,-1,0,0,1,0,-1};
    int dfs(int x,int y)
    {
        int maxx=0,xx,yy,ans;
        if(!dp[x][y])
        {
            for(int i=1;i<=k;i++)
            {
                for(int j=0;j<4;j++)
                {
                     xx=x+t[j][0]*i;
                     yy=y+t[j][1]*i;
                    if(xx>=0&&xx<n&&yy>=0&&yy<n&&s[xx][yy]>s[x][y])
                    {
                         ans=dfs(xx,yy);
                        if(ans>maxx)
                        maxx=ans;
                    }
                }
            }
            dp[x][y]=maxx+s[x][y];
        }
        return dp[x][y];
    }
    int main()
    {
        while(scanf("%d%d",&n,&k)>0)
        {
            if(n==-1&&k==-1)
            break;
            for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
            scanf("%d",&s[i][j]);
            memset(dp,0,sizeof(dp));
            int sum=dfs(0,0);
            printf("%d
    ",sum);
        }
        return 0;
    } 
    

     re代码:

    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    using namespace std;
    int dp[110][110],s[110][110];
    int n,k,t[4][2]={1,0,-1,0,0,1,0,-1};
    int dfs(int x,int y)
    {
        int maxx=0,xx,yy,ans;
        if(!dp[x][y])
        {
            for(int i=1;i<=k;i++)
            {
                for(int j=0;j<4;j++)
                {
                     xx=x+t[j][0]*i;
                     yy=y+t[j][1]*i;
                    if(s[xx][yy]>s[x][y]&&xx>=0&&xx<n&&yy>=0&&yy<n)   //这里错了,不能将s[xx][yy]先判断,否则出现re 
                    {
                         ans=dfs(xx,yy);
                        if(ans>maxx)
                        maxx=ans;
                    }
                }
            }
            dp[x][y]=maxx+s[x][y];
        }
        return dp[x][y];
    }
    int main()
    {
        while(scanf("%d%d",&n,&k)>0)
        {
            if(n==-1&&k==-1)
            break;
            for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
            scanf("%d",&s[i][j]);
            memset(dp,0,sizeof(dp));
            int sum=dfs(0,0);
            printf("%d
    ",sum);
        }
        return 0;
    } 
    
  • 相关阅读:
    AtCoder Beginner Contest 064 D
    ZOJ 3956 Course Selection System [01背包]
    理解01背包
    模块(二)
    内置函数+递归+模块使用
    函数进阶
    使用markdown编辑器
    函数进阶(二)
    函数进阶(一)
    函数基础
  • 原文地址:https://www.cnblogs.com/ziyi--caolu/p/3197714.html
Copyright © 2011-2022 走看看