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