#include <cstdio> #include <cstring> #include <queue> #include <algorithm> using namespace std; const int N(1003); int cost[N]={0},coin[N][N]={0},f[N][N]={0},val[N][N]={0},M[N]={0},n,m,p; struct node{ int w,i; bool operator<(const node &x)const{ return w<x.w; } }; priority_queue<node> Q[N<<1]; inline int maxx(const int &x,const int &y){ return x>y?x:y; } void init() { scanf("%d%d%d",&n,&m,&p); for(int i=0;i<n;i++) for(int j=1;j<=m;j++) scanf("%d",&coin[i][j]); for(int i=0;i<n;i++) scanf("%d",&cost[i]); for(int i=1;i<=m;i++) for(int j=0;j<n;j++) { int q=j-1; if(q<0) q=n-1; val[i][j]=val[i-1][q]+coin[q][i]; } } void dp() { for(int i=0;i<n;i++) { node v; v.i=0;v.w=-cost[i]; Q[i].push(v); } for(int i=1;i<=m;i++) { M[i]=-(1<<30); for(int j=0;j<n;j++) { int no=(j-i+n*m)%n; node v=Q[no].top(); while(i-v.i>p) { Q[no].pop(); v=Q[no].top(); } f[i][j]=v.w+val[i][j]; M[i]=maxx(M[i],f[i][j]); } for(int j=0;j<n;j++) { node v; v.i=i,v.w=M[i]-val[i][j]-cost[j]; Q[(j-i+n*m)%n].push(v); } } printf("%d\n",M[m]); } int main() { init(); dp(); return 0; } /************************************************************** Problem: 2287 User: admin Language: C++ Result: Accepted Time:336 ms Memory:15180 kb ****************************************************************/