题目链接:http://codeforces.com/problemset/problem/446/B
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=1e3+3; int matrix[N][N]; ll row[N],col[N]; ll dpr[N*N],dpc[N*N]; priority_queue <ll> q; int main() { ll n,m,k,p; scanf("%I64d%I64d%I64d%I64d",&n,&m,&k,&p); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { scanf("%d",&matrix[i][j]); row[i]+=matrix[i][j]; col[j]+=matrix[i][j]; } } for(int i=1;i<=n;i++) q.push(row[i]); for(int i=1;i<=k;i++) { ll temp=q.top(); q.pop(); dpr[i]=dpr[i-1]+temp; temp-=m*p; q.push(temp); } while(!q.empty()) q.pop(); for(int i=1;i<=m;i++) q.push(col[i]); for(int i=1;i<=k;i++) { ll temp=q.top(); q.pop(); dpc[i]=dpc[i-1]+temp; temp-=n*p; q.push(temp); } ll ans=dpr[0]+dpc[k]; for(ll i=1;i<=k;i++) ans=max(ans,dpr[i]+dpc[k-i]-i*(k-i)*p); printf("%I64d ",ans); return 0; }