zoukankan      html  css  js  c++  java
  • 面试常考题 max pool实现

    题目

    二维矩阵(nm) 求每个(lw)的子矩阵的最大元素, 就是一维滑动窗口的升级版

    自己瞎掰的题解

    #include <bits/stdc++.h>
    using namespace std;
    
    const int N = 1e3;
    int n, m;
    // l 代表长 w 代表宽
    int l, w;
    
    int s[N][N];
    int dp[N][N];
    
    // 相当于每行的我用单调队列做一遍 去取区间最大值
    void init(int row, int *t) {
        deque<int> que;
        for(int i=0; i<m; i++) {
            if(que.empty())
                que.push_back(i);
            else {
                while(!que.empty() && i - que.front() >= l)
                    que.pop_front();
                while(!que.empty() && t[i] > t[que.back()])
                    que.pop_back();
                que.push_back(i);
            }
            dp[row][i] = t[que.front()];
        }
        return ;
    }
    
    void solve() {
        memset(dp, 0, sizeof(dp));
        for(int i=0; i<n; i++) {
            init(i, s[i]);
        }
        // 然后我竖着做一遍
        for(int i=w-1; i<n; i++) {
            for(int j=l-1; j<m; j++) {
                int mx = 0;
                for(int k=i-w+1; k<=i; k++) {
                    mx = max(dp[k][j], mx);
                }
                cout<< mx <<" ";
            }
            cout << endl;
        }
    
    }
    
    int main()
    {
        freopen("data.txt", "r", stdin);
        cin >> n >> m >> l >> w;
        for(int i=0; i<n; i++) {
            for(int j=0; j<m; j++) {
                scanf("%d", &s[i][j]);
            }
        }
        solve();
        return 0;
    }
    
  • 相关阅读:
    BZOJ2111: [ZJOI2010]Perm 排列计数
    BZOJ1951: [Sdoi2010]古代猪文
    组合数取模
    BZOJ2226: [Spoj 5971] LCMSum
    BZOJ2820: YY的GCD
    数据结构讲题选做
    解题:HAOI 2015 按位或
    解题:SHOI 2006 有色图
    解题:洛谷 4986 逃离
    解题:HNOI 2013 Cards
  • 原文地址:https://www.cnblogs.com/Draymonder/p/11521960.html
Copyright © 2011-2022 走看看