生活随笔
收集整理的這篇文章主要介紹了
SMU_problem1357最大子方块
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最大子方塊
題目如下:
分析:
建立一個二維數組,每個點有三個變量,長,高,面積;
數組為1時,長,高,面積為1;
數組為0時,長,高,面積為0;
然后從左上角開始遍歷數組,當左邊的點非0時,把左邊的點的長加1:p[i][j].l=p[i][j-1].l+1;
????????????????????????????????????同理:當上面的點非0時,把上面的點的高加1:p[i][j].h=p[i-1][j].h+1;
賦值好了后開始遞歸計算最大空間:
最大子方塊有如下三種情況:1.上面和左邊都是0時;面積為1;
????????????????????????????????????????????? ?2. 上面或則下面有一個不為0時,面積為p[i][j]中l和h的最大值。
???????????????????????????????????????????? ? 3. 上面和下面都不為0時,面積按照下圖計算:
我們一次次比較黑紫綠黃藍紅這五個長方形面積?得出做大面積,將其賦值給面積。
#include<iostream>
#include<string>
using namespace std;
//我們所要使用的結構體;
struct point
{int l,h,are;//長,高,面積;//初始化void set(){l=h=are=0;}void out(){if(are>=10)cout<<"("<<l<<"*"<<h<<"="<<are<<") ";elsecout<<"("<<l<<"*"<<h<<"="<<are<<" ) ";}
};
int main()
{int n,m,i,j;int ad[30][30];point p[30][30];string s;while(cin>>n>>m){//初始化將數組清零;for(i=0;i<=n;i++)for(j=0;j<=m;j++)p[i][j].set();//輸入字符串,將其賦值,數組從下標1,1開始for(i=1;i<=n;i++){cin>>s;for(j=0;j<m;j++)p[i][j+1].h=p[i][j+1].l=p[i][j+1].are=s[j]-'0';} //計算最大子空間for(i=1;i<=n;i++){for(j=1;j<=m;j++){//當p[i,j]不為零時,分析:if(p[i][j].l!=0&&p[i][j].h!=0){//遍歷數組,設置數值給l,h;if(p[i-1][j].h!=0)p[i][j].h=p[i-1][j].h+1;if(p[i][j-1].l!=0)p[i][j].l=p[i][j-1].l+1;//處于情況1,2;上面和下面至少有一個不為零時,取p[i][j]的l和h的最大值賦值給areif(p[i-1][j].h==0||p[i][j-1].l==0){if(p[i][j].h>p[i][j].l)p[i][j].are=p[i][j].h;elsep[i][j].are=p[i][j].l;}else//處于情況3;上面和下面全不為零時,取計算所得的面積最大值賦值給are{int min;min=p[i][j].h;//向左遞歸,計算矩形面積。用min記錄最小的高for(int k=j;p[i][k].l!=0;k--){//向左遞歸,發現比min更小的高時,刷新min的值;if(min>p[i][k].h)min=p[i][k].h;//此時面積=min*寬;若比are更大,刷新are的值;if(min*(j-k+1)>=p[i][j].are)p[i][j].are=min*(j-k+1);}}}}}/* 解除屏蔽后,可以看到求得的數值for(i=0;i<=n;i++){for(j=0;j<=m;j++)p[i][j].out();cout<<endl;}cout<<endl;*///設置一個max,循環數組的最大子面積int max=0;for(i=1;i<=n;i++){for(j=1;j<=m;j++){if(p[i][j].are>max)max=p[i][j].are;}}cout<<max<<endl;}return 0;
}
總結
以上是生活随笔為你收集整理的SMU_problem1357最大子方块的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。