程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU 1078 FatMouse and Cheese(記憶化搜索)

HDU 1078 FatMouse and Cheese(記憶化搜索)

編輯:C++入門知識

題意:給定一幅圖,每個點有一定權值,現在有一只老鼠在起始點(0,0),他能水平或者垂直移動1~k格之後,停在某點並獲得權值,而且每次移動後所在的點,都要比剛離開的那個點的權值更大,求最多能獲得多少權值。

分析:依舊是搜索,把條件分析清楚,dp[i][j] 表示從i,j出發能獲得的最多的權值。

 

#include<cstdio>   
#include <iostream>   
#include <cstring>   
#include <cmath>   
#include <algorithm>   
# 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<n; i++) {  
            for(j=0; j<n; j++) {  
                scanf("%d",&map[i][j]);  
            }  
        }  
        cout << dfs(0,0) << endl;  
    }  
    return 0;  
}  

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved