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\n",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\n", ans);
    return 0;
}
单调栈

 

 

posted @ 2013-10-24 21:35  GLSilence  阅读(250)  评论(0编辑  收藏  举报