zoukankan      html  css  js  c++  java
  • POJ 3250 Bad Hair Day(DP / 单调栈)

    Bad Hair Day

    开个标记数组记录,记录右边第一个比它大的位置。

    #include <stdio.h>
    #include <string.h>
    #define N 80001
    long long p[N],left[N],sum;
    int main()
    {
        int n,i,j;
        scanf("%d",&n);
        for(i = 1; i <= n; i++)
            scanf("%lld",&p[i]);
        sum = 0;
        for(i = n; i >= 1; i--)
        {
            j = i+1;
            while(j <= n && p[j] < p[i])
            {
                j = left[j];
            }
            left[i] = j;
            sum += j-i-1;
        }
        printf("%lld
    ",sum);
        return 0;
    }
    DP

    单调栈:

    给出这些牛的高度,要求每头牛可以看到的牛的数量的和。

    把要求作一下转换,其实就是要求每头牛被看到的次数之和。这个可以使用单调栈来解决。

    从左到右依次读取当前牛的高度,从栈顶开始把高度小于或等于当前牛的高度的那些元素删除,此时栈中剩下的元素的数量就是可以看见当前牛的其他牛的数量。把这个数量加在一起,就可以得到最后的答案了。

    #include <iostream>
    #include <cstdio>
    using namespace std;
    
    const int N = 80005;
    int stack[N];
    int top, n;
    
    int main()
    {
        int num;
        long long ans = 0;
        scanf("%d", &n);
        for (int i = 0; i < n; ++i)
        {
            scanf("%d", &num);
            while (top > 0 && stack[top - 1] <= num)
                --top;
            ans += top;
            stack[top++] = num;
        }
        printf("%lld
    ", ans);
        return 0;
    }
    单调栈
  • 相关阅读:
    java后台读取配置文件
    冒泡排序
    均分火柴
    Dos 批处理 Shutdown
    时间复杂度分析
    Python冒泡排序
    Python装饰器
    获取状态栏高度
    利用zxing生成二维码
    Android下利用zxing类库实现扫一扫
  • 原文地址:https://www.cnblogs.com/Silence-AC/p/3386849.html
Copyright © 2011-2022 走看看