zoukankan      html  css  js  c++  java
  • 动态规划____有重叠子问题的搜索,都可以转为记忆化搜索

    1.细节还是挺重要的,m n一定别写错

    2.用INF标记未访问的点的方法 确实不错

    3.如题:有重叠子问题的搜索,都可以转为记忆化搜索

    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <iostream>
    #define INF 0
    #define MAX 110
    
    using namespace std;
    
    int input[MAX][MAX];
    int dp[MAX][MAX];
    int m, n;
    
    int max(int a, int b)
    {
        return a>b?a:b;
    }
    
    int d(int i , int j)
    {
        if(dp[i][j] != INF)
            return dp[i][j];
        else
        {
            dp[i][j] = 1;//注意此处的赋值 每一道题都有各自的含义与赋值
            
            if(i-1 >= 0 && input[i-1][j] < input[i][j]) dp[i][j] = max(d(i-1,j) + 1, dp[i][j]);
            if(j-1 >= 0 && input[i][j-1] < input[i][j]) dp[i][j] = max(d(i,j-1) + 1, dp[i][j]);
            if(i+1 < m  && input[i+1][j] < input[i][j]) dp[i][j] = max(d(i+1,j) + 1, dp[i][j]);
            if(j+1 < n  && input[i][j+1] < input[i][j]) dp[i][j] = max(d(i,j+1) + 1, dp[i][j]);
    
            return dp[i][j];
        }
    }
    
    int main()
    {
        int i, j;
        int N;
    scanf("%d", &N); while(N--) { memset(dp, INF, sizeof(dp)); scanf("%d%d", &m, &n); for(i = 0; i < m; i++) { for(j = 0; j < n; j++) { scanf("%d", &input[i][j]); } } int max = 0; for(i = 0; i < m; i++) { for(j = 0; j < n; j++) { int temp = d(i, j); if(temp > max) max = temp; } } printf("%d ", max); } return 0; }

    http://poj.org/problem?id=1088 滑雪

  • 相关阅读:
    USACO6.4-The Primes
    ZOJ2112--Dynamic Rankings (动态区间第k大)
    Havel定理
    HDU5107---K-short Problem (线段树区间 合并、第k大)
    POJ2104-- K-th Number(主席树静态区间第k大)
    poj2409 & 2154 polya计数+欧拉函数优化
    CodeForces
    HDU
    HDU
    Gym
  • 原文地址:https://www.cnblogs.com/wwjyt/p/3169684.html
Copyright © 2011-2022 走看看