题目大意:
给你一个
解题思路:
这道题我只想出了
我们用

然后我们令

那么显然
显然
令

那么同
然后这道题目就解决了。
输出就简单了
AC代码:
#include
#include
#include
#include
#include
#include
using namespace std; int n,m; int ch[200][200]={{0}}; short top[200][200][200]={{{0}}}; short F[200][200][200]={{{0}}}; short G[200][200][200]={{{0}}}; short H[200][200][200]={{{0}}}; int area=0; int ai=0,al=0,ar=0; int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { scanf("%d",&ch[i][j]); top[i][j][1]=(short)(ch[i][j]^1)*(top[i-1][j][1]+1); } for(int i=n;i>=1;i--) for(int j=m;j>=1;j--) { if(ch[i][j]==1) continue; for(int k=2;k+j-1<=m && ch[i][k+j-1]==0;k++) { top[i][j][k]=min(top[i][j][1],top[i][j+1][k-1]); F[i][j][k]=top[i][j][k]*k; } } for(int i=2;i<=n;i++) for(int j=m;j>=1;j--) { if(ch[i][j]==1) continue; int k; for(k=1;k+j-1<=m && ch[i][k+j-1]==0;k++);k--; int Max=0; for(int r=m-j+1;r>k;r--) Max=max((int)F[i-1][j][r],Max); for(int r=k;r>=1;r--) { if(G[i-1][j][r]>0) G[i][j][r]=G[i-1][j][r]+r; if(Max>0) G[i][j][r]=max((short)(Max+r),G[i][j][r]); Max=max((int)F[i-1][j][r],Max); } } for(int i=2;i<=n;i++) for(int j=m;j>=1;j--) { if(ch[i][j]==1) continue; int Max=0; for(int k=1;k+j-1<=m && ch[i][k+j-1]==0;k++) { H[i][j][k]=max((H[i-1][j][k]>0)*(H[i-1][j][k]+k),(Max>0)*(Max+k)); Max=max((int)G[i-1][j][k],Max); if(H[i][j][k]>area) { area=H[i][j][k]; ai=i,al=j,ar=k; } } } if(area<5) cout<<-1<
0;ai--) for(int i=1;i<=ar;i++) ch[ai][al+i-1]=8; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) printf("%d ",ch[i][j]); puts(""); } } return 0; }