noip模拟赛(有点bug,明日调)

来源:互联网 发布:shopwwi 统计无数据 编辑:程序博客网 时间:2024/05/26 07:29
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int maxn=302;
short a[maxn][maxn],n,m,p,minn[maxn][maxn][maxn][2];
int s[maxn][maxn],f[maxn],las[maxn],las3[maxn];
int main(){
 scanf("%d%d",&n,&m,&p);
 for(int i=1;i<=n;i++){
  for(int j=1;j<=m;j++){
   scanf("%d",&a[i][j]);
  }
 }
 int las1=-100000000,ans=-100000000;
 for(int i=1;i<=m;i++){
  las1=-100000000;
  for(int j=1;j<=n;j++){
   int now=p-a[j][i];
   if(now>las1){
    for(int k=1;k<=j;k++){
     minn[i][k][j][0]=now;
     //minn[i][k][j][1]=a[j][i];
    }
    las1=now; //las2=a[j][i]
   }
   else{
    for(int k=1;k<=j;k++){
     minn[i][k][j][0]=las1;
    // minn[i][k][j][1]=las2;
    }
   }
   s[j][i]=s[j][i-1]+a[j][i];
  }
 }
 for(int i=1;i<=n;i++){
  for(int j=i;j<=n;j++){
   int las1=-100000000,las2=-100000000;
   for(int k=1;k<=m;k++) las[i]=-100000000,las3[i]=-100000000;
   for(int k=1;k<=m;k++){
    f[i]=0;
   }
   for(int k=1;k<=m;k++){
    if(k==1){
     las[k]=minn[k][i][j][0];
     //las3[k]=minn[k][i][j][1];
     f[k]=f[k-1]+s[k][j]-s[k][i-1]+las[k];
     continue;
    }
    f[k]=s[k][j]-s[k][i-1];
    if(minn[k][i][j][0]>las[k-1]){
     las[i]=minn[k][i][j][0];
     las3[i]=minn[k][i][j][0]+minn[k][i][j][1];
     if(f[k-1]-(las[k-1])){
      f[k]+=f[k]-las[k-1];
     }
     f[k]+=las[i];
    }
    else{
     las[i]=las[i-1];
     if(f[k-1]) f[k]+=f[k-1];
    }
   }
   for(int k=1;k<=m;k++)
    ans=max(ans,f[k]);
  }
 }
 cout<<ans<<endl;
 return 0;
}