程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 九度OJ 1497:面積最大的全1子矩陣(DP)

九度OJ 1497:面積最大的全1子矩陣(DP)

編輯:C++入門知識

九度OJ 1497:面積最大的全1子矩陣(DP)


題目1497:面積最大的全1子矩陣

時間限制:1 秒

內存限制:128 兆

特殊判題:否

提交:850

解決:178

題目描述:

在一個M * N的矩陣中,所有的元素只有0和1,從這個矩陣中找出一個面積最大的全1子矩陣,所謂最大是指元素1的個數最多。

輸入:

輸入可能包含多個測試樣例。
對於每個測試案例,輸入的第一行是兩個整數m、n(1<=m、n<=1000):代表將要輸入的矩陣的大小。
矩陣共有m行,每行有n個整數,分別是0或1,相鄰兩數之間嚴格用一個空格隔開。

輸出:

對應每個測試案例,輸出矩陣中面積最大的全1子矩陣的元素個數。

樣例輸入:
2 2
0 0
0 0
4 4
0 0 0 0
0 1 1 0
0 1 1 0
0 0 0 0
樣例輸出:
0
4
來源:
騰訊2012年暑期實習生招聘面試二面試題
#include

int dp[1005][1005];//dp[i][j]代表位置(i,j)左上角矩陣之和
int a[1005][1005];

int main()
{
    int n,m;
    for(int i=0;i<=1000;i++)
        dp[0][i]=dp[i][0]=0;
    while(scanf("%d%d",&n,&m)>0)
    {
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
            scanf("%d",&a[i][j]);
        int sum=0;
        for(int i=1;i<=n;i++)//處理
        {
            sum=0;
            for(int j=1;j<=m;j++)
            {
               sum+=a[i][j]; dp[i][j]=dp[i-1][j]+sum;
            }
        }
        
        int maxk=0;
        for(int i=n;i>0;i--)
        for(int j=m;j>0&&maxk=0)//先只有一行時向左擴展
            {
                if(dp[i][j]-dp[i][j-c]-dp[i-r][j]+dp[i-r][j-c]==r*c)
                {
                     if(maxk=0&&c>0)//有多行時向現擴展,有可能列要往回縮
            {
                if(dp[i][j]-dp[i][j-c]-dp[i-r][j]+dp[i-r][j-c]==r*c)
                {
                    if(maxk

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved