1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| #include<bits/stdc++.h> using namespace std; const int maxn=35; struct Node{ int ans; int least; }f[maxn][maxn][maxn][maxn]; int a[maxn][maxn]; int sum[maxn][maxn]; int tot=0; int n,m,u; int get_sum(int x1,int y1,int x2,int y2){ int k=sum[x2][y2]+sum[x1-1][y1-1]-sum[x1-1][y2]-sum[x2][y1-1]; return k; } Node dfs(int x1,int y1,int x2,int y2,int broke){ if(f[x1][y1][x2][y2].ans) return f[x1][y1][x2][y2]; Node tmp;tmp.ans=1;tmp.least=u-tot+broke; if(x1==x2&&y1==y2) return tmp; for(int i=x1;i<x2;i++){ int area1=get_sum(x1,y1,i,y2),area2=get_sum(i+1,y1,x2,y2); if(area1<=u&&tot-area1<=u&&area2<=u&&tot-area2<=u){ Node ans1=dfs(x1,y1,i,y2,area1),ans2=dfs(i+1,y1,x2,y2,area2); if(ans1.ans+ans2.ans>tmp.ans){ tmp.ans=ans1.ans+ans2.ans; tmp.least=min(ans1.least,ans2.least); } else if(ans1.ans+ans2.ans==tmp.ans) tmp.least=max(tmp.least,min(ans1.least,ans2.least)); } } for(int i=y1;i<y2;i++){ int area1=get_sum(x1,y1,x2,i),area2=get_sum(x1,i+1,x2,y2); if(area1<=u&&tot-area1<=u&&area2<=u&&tot-area2<=u){ Node ans1=dfs(x1,y1,x2,i,area1),ans2=dfs(x1,i+1,x2,y2,area2); if(ans1.ans+ans2.ans>tmp.ans){ tmp.ans=ans1.ans+ans2.ans; tmp.least=min(ans1.least,ans2.least); } else if(ans1.ans+ans2.ans==tmp.ans) tmp.least=max(tmp.least,min(ans1.least,ans2.least)); } } return f[x1][y1][x2][y2]=tmp; } int main(){ scanf("%d%d%d",&n,&m,&u); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&a[i][j]),tot+=a[i][j]; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) sum[i][j]=a[i][j]+sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]; Node res=dfs(1,1,n,m,tot); printf("%d %d",res.ans,res.least); return 0; }
|