2018.8.12字节跳动笔试第四题-区间动态规划

题目描述

两个长度为n的序列a, b,问有多少个区间[l,r]满足如下式子:
max ( a [ l , r ] ) < min ( b [ l , r ] ) , 0 l r < n
即a区间的最大值小于b区间的最小值。
数值范围: n<1e5, aibi<1e9

输入描述

第一行一个整数n
第二行n个数,第i个为ai
第三行n个数,第i个为bi

输出描述

一行一个整数,表示答案

示例

输入

3
3 2 1
3 3 3

输出

3

思路描述

使用枚举法迭代需要三层嵌套的循环,首先遍历l和r,即行和列,然后循环比较[l, r]区间的最大值和最小值,时间复杂度过大。

d p _ m a x [ i , j ] = max ( d p _ m a x [ i , j 1 ] , a [ i , j ] )

区间的最大值是其所有子区间的最大值。

代码实现

#include <iostream>
#include <vector>
#include <string.h>

using namespace std;

int main() {
    // input data
    int n; cin >> n;
    vector<int> a, b;
    for (int i=0;i<n;++i) {
        int t; cin >> t;
        a.push_back(t);
    }
    for (int i=0;i<n;++i) {
        int t; cin >> t;
        b.push_back(t);
    }

    // dp
    int dp_max[n][n], dp_min[n][n]; // vector<vector<int> > dp(n, vector<int>(n,0));
    for (int i=0;i<n;++i) {
        dp_max[i][i] = a[i];
        dp_min[i][i] = b[i];
        for (int j=i+1;j<n;++j) {
            dp_max[i][j] = max(dp_max[i][j-1], a[j]);
            dp_min[i][j] = min(dp_min[i][j-1], b[j]);
        }
    }
    // count
    int count = 0;
    for (int i=0;i<n;++i)
        for (int j=i;j<n;++j)
            if (dp_max[i][j] < dp_min[i][j])
                count++;
    cout << count;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Asun0204/article/details/81606180