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