日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SMU_problem1357最大子方块

發布時間:2024/1/18 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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最大子方块的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。