zoukankan      html  css  js  c++  java
  • POJ 1088 滑雪 (记忆化搜索)

    题目链接:http://poj.org/problem?id=1088

    题意很好懂,就是让你求一个最长下降路线的长度。

    dp[i][j]记录的是i j这个位置的最优的长度,然后转移方程是dp[i][j] = max(dp[i][j - 1], dp[i - 1][j], dp[i][j + 1], dp[i + 1][j]) + 1。

    已知最低点的答案 慢慢倒推到高点的答案。(还是对记忆化搜不熟练啊)

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 using namespace std;
     5 const int MAXN = 105;
     6 int dp[MAXN][MAXN] , r , c , h[MAXN][MAXN] , cont;
     7 int tx[] = {-1 , 0 , 1 , 0} , ty[] = {0 , -1 , 0 , 1};
     8 
     9 int dfs(int x , int y) {
    10     if(dp[x][y]) 
    11         return dp[x][y];
    12     for(int i = 0 ; i < 4 ; i++) {
    13         int xx = x + tx[i] , yy = y + ty[i];
    14         if(xx < 1 || yy < 1 || xx > r || yy > c || h[xx][yy] >= h[x][y]) {
    15             continue;
    16         }
    17         dp[x][y] = max(dfs(xx , yy) , dp[x][y]);
    18     }
    19     return (++dp[x][y]);
    20 }
    21 
    22 int main()
    23 {
    24     while(~scanf("%d %d" , &r , &c)) {
    25          cont = 0;
    26          memset(dp , 0 , sizeof(dp));
    27          for(int i = 1 ; i <= r ; i++) {
    28              for(int j = 1 ; j <= c ; j++) {
    29                  scanf("%d" , &h[i][j]);
    30              }
    31          }
    32          for(int i = 1 ; i <= r ; i++) {
    33              for(int j = 1 ; j <= c ; j++) {
    34                  cont = max(cont , dfs(i , j));
    35              }
    36          }
    37          printf("%d
    " , cont);
    38     }
    39 }
  • 相关阅读:
    Android 之 JSON操作
    android 之 XMLPull
    DOM 之 SAX操作
    android之DOM生成与解析
    parseDouble()方法
    读取遥感图像中遇到的问题集锦
    xml学习
    linux基础
    hadoop的基本概念 伪分布式hadoop集群的安装 hdfs mapreduce的演示
    【原】自定义tableViewCell的两种方法
  • 原文地址:https://www.cnblogs.com/Recoder/p/5411762.html
Copyright © 2011-2022 走看看