设为首页 加入收藏

TOP

HDU 1078 FatMouse and Cheese(记忆化搜索)
2014-11-23 21:54:12 来源: 作者: 【 】 浏览:10
Tags:HDU 1078 FatMouse and Cheese 记忆 搜索

题意:给定一幅图,每个点有一定权值,现在有一只老鼠在起始点(0,0),他能水平或者垂直移动1~k格之后,停在某点并获得权值,而且每次移动后所在的点,都要比刚离开的那个点的权值更大,求最多能获得多少权值。

分析:依旧是搜索,把条件分析清楚,dp[i][j] 表示从i,j出发能获得的最多的权值。

#include   
#include    
#include    
#include    
#include    
# define MAX 111   
using namespace std;  
  
int dirx[4] = {1,-1,0,0} ;  
int diry[4] = {0,0,1,-1} ;  
int n,k;  
int map[MAX][MAX];  
long long dp[MAX][MAX];  
int vis[MAX][MAX];  
  
bool inside(int x,int y) {  
    if(x < 0 || x >=n || y < 0 || y >= n) {  
        return false;  
    }  
    return true;  
}  
  
void init() {  
  
    memset(vis,0,sizeof(vis));  
    memset(dp,0,sizeof(dp));  
}  
  
long long dfs(int x,int y) {  
    if(dp[x][y] != 0) return dp[x][y];  
    vis[x][y] = 1;  
  
    long long maxx = -1;  
    for(int i=0; i<4; i++) {  
        for(int j=1; j<=k; j++) {  
            int xx = x + dirx[i] * j;  
            int yy = y + diry[i] * j;  
            if(inside(xx,yy) && vis[xx][yy] == 0 && map[xx][yy] > map[x][y]) {  
                maxx = max(maxx,dfs(xx,yy));  
                vis[xx][yy] = 0;  
            }  
        }  
    }  
    if(maxx == -1) {  
        return dp[x][y] = map[x][y];  
    }  
    return dp[x][y] = maxx + map[x][y];  
}  
  
int main() {  
    int i,j;  
    while(cin >> n >> k) {  
        if(n == -1 && k == -1) {  
            break;  
        }  
        init();  
        for(i=0; i 
 

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C++ const关键字用法详解 下一篇C++虚函数表调用学习

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Linux 系统监控 的完 (2025-12-27 08:52:29)
·一口气总结,25 个 L (2025-12-27 08:52:27)
·【总结】100个最常用 (2025-12-27 08:52:22)
·有没有哪些高效的c++ (2025-12-27 08:20:57)
·Socket 编程时 Accep (2025-12-27 08:20:54)