zoukankan      html  css  js  c++  java
  • [HDOJ1078]FatMouse and Cheese(记忆化搜索)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1078

    题意:给出n, k,然后给出n*n的地图,(下标0~n-1),有一只老鼠从(0,0)处出发,只能走直线,并且目标点的数值比当前点要大。每次最长可以走k步,问最长的一条链的数值和。

    用一个二维数组dp(i,j)表示某一格出发的时候最长链的数值和,然后dfs。

     1 #include <algorithm>
     2 #include <iostream>
     3 #include <iomanip>
     4 #include <cstring>
     5 #include <climits>
     6 #include <complex>
     7 #include <fstream>
     8 #include <cassert>
     9 #include <cstdio>
    10 #include <bitset>
    11 #include <vector>
    12 #include <deque>
    13 #include <queue>
    14 #include <stack>
    15 #include <ctime>
    16 #include <set>
    17 #include <map>
    18 #include <cmath>
    19 
    20 using namespace std;
    21 
    22 const int maxn = 111;
    23 const int dx[4] = {0, 0, 1, -1};
    24 const int dy[4] = {1, -1, 0, 0};
    25 int n, k;
    26 int G[maxn][maxn];
    27 int dp[maxn][maxn];
    28 
    29 bool ok(int x, int y) {
    30     return x >= 0 && y >= 0 && x < n && y < n;
    31 }
    32 
    33 int dfs(int x, int y) {
    34     if(dp[x][y]) return dp[x][y];
    35     int cur = 0;
    36     for(int i = 0; i < 4; i++) {
    37         for(int j = 1; j <= k; j++) {
    38             int xx = x + dx[i] * j;
    39             int yy = y + dy[i] * j;
    40             if(ok(xx, yy) && G[xx][yy] > G[x][y]) {
    41                 cur = max(cur, dfs(xx, yy));
    42             }
    43         }
    44     }
    45     return dp[x][y] = cur + G[x][y];
    46 }
    47 
    48 inline bool scan_d(int &num) {
    49     char in;bool IsN=false;
    50     in=getchar();
    51     if(in==EOF) return false;
    52     while(in!='-'&&(in<'0'||in>'9')) in=getchar();
    53     if(in=='-'){ IsN=true;num=0;}
    54     else num=in-'0';
    55     while(in=getchar(),in>='0'&&in<='9'){
    56             num*=10,num+=in-'0';
    57     }
    58     if(IsN) num=-num;
    59     return true;
    60 }
    61 
    62 int main() {
    63     // freopen("in", "r", stdin);
    64     while(~scanf("%d%d", &n, &k) && n + k != -2) {
    65         memset(dp, 0, sizeof(dp));
    66         for(int i = 0; i < n; i++) {
    67             for(int j = 0; j < n; j++) {
    68                 scan_d(G[i][j]);
    69             }
    70         }
    71         printf("%d
    ", dfs(0, 0));
    72     }
    73     return 0;
    74 }
  • 相关阅读:
    poj3625
    Directx10,11的SwapChain,RenderTarget和DepthBuffer解释
    Everything you need to know about Authenticode Code Signing
    Best Render Settings for After Effects CS5
    javascript 中cookie的存储,获取cookie,删除cookie的方法
    白话数字签名(番外篇)——签名EXE文件(下)
    在php中使用CKEDITOR在线编辑器
    HTML5 VIDEO标签播放事件流水
    白话数字签名(番外篇)——签名EXE文件(上)
    自定义hint框
  • 原文地址:https://www.cnblogs.com/kirai/p/5462473.html
Copyright © 2011-2022 走看看