hdu4374

堆栈,单调队列

#include<iostream>
#include<queue>
#include<algorithm>
#include<stdio.h>
#include<cmath>
using namespace std;
#define MAXN 500000000
struct Point
{
    int val,pos;
};
int n,m,x,t;
int dp[101][10010];
int g[101][10010];
int dist[10010];
bool operator < (Point a,Point b)
{
    return a.val<b.val;
}
void WorkDis(int k)
{
    dist[0]=0;
    for (int i=1;i<=m;i++)
    dist[i]=dist[i-1]+g[k][i];
}
void mainwork()
{
    for (int i=1;i<=n;i++)
    for (int j=1;j<=m;j++)
    scanf("%d",&g[i][j]);
    WorkDis(1);
    for (int i=1;i<=m;i++)
    dp[1][i]=-MAXN;
    for (int i=max(x-t,1);i<=min(x+t,m);i++)
    dp[1][i]=dist[max(x,i)]-dist[min(x,i)]+g[1][min(i,x)];
    for (int i=2;i<=n;i++)
    {
        WorkDis(i);
        priority_queue<Point> qLeft,qRight;
        for (int j=1;j<=m;j++)
        {
            if(dp[i-1][j]!=-MAXN)
            {
                Point p;
                p.pos=j;
                p.val=dp[i-1][j]-dist[j-1];
                qLeft.push(p);
            }
            while (qLeft.empty()==false && j-qLeft.top().pos>t)  qLeft.pop();
            if (qLeft.empty())  dp[i][j]=-MAXN;
            else dp[i][j]=qLeft.top().val+dist[j];
        }
        for (int j=m;j>=1;j--)
        {
            if(dp[i-1][j]!=-MAXN)
            {
                Point p;
                p.pos=j;
                p.val=dp[i-1][j]-(dist[m]-dist[j]);
                qRight.push(p);
            }
            while (qRight.empty()==false  &&  qRight.top().pos-j>t)  qRight.pop();
            if (qRight.empty()==false)
            dp[i][j]=max(dp[i][j],qRight.top().val+(dist[m]-dist[j]+g[i][j]));
        }
    }
    int maxx=-MAXN;
    for (int i=1;i<=m;i++)
    maxx=max(maxx,dp[n][i]);
    printf("%d\n",maxx);
}
int main()
{
    while (scanf("%d%d%d%d",&n,&m,&x,&t)!=EOF)
    mainwork();
    return 0;
}

所犯的错误在初始化的时候,求dp【1】【i】

先用了abs 

posted @ 2012-08-18 14:37  徐徐而来  阅读(158)  评论(0编辑  收藏  举报