1. 程式人生 > >【矩陣】【hdu 薛貓貓004】

【矩陣】【hdu 薛貓貓004】

題目:

Problem Description

有一個二維矩陣,長和寬分別是N,M。矩陣上的每個點有兩個狀態(0,1),問能不能找到一個K*K的子矩陣,子矩陣裡面每個點的狀態全為0?

Input

第一行為一個整數T,代表T組資料。(1=<T<=10)
第二行為三個整數N,M,K。(1<=N,M<=1000,1<=K<=min(N,M))
接下來N行,每行有M個整數,代表矩陣上對應的點的狀態,狀態只有0,1兩種。

Output

對於每個測試樣例,輸出一行,如果能找到子矩陣,輸出"Yes",否則輸出"No"。每個測試樣例佔一行。

Sample Input

2 3 3 2 1 0 0 1 0 0 1 1 1 3 3 2 1 0 0 0 1 0 0 0 0

Sample Output

Yes No

解題報告:dp尋找最大的全0矩陣,之後與k比較即可。

 

ac程式碼:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAX 1100
int matrix[MAX][MAX];

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int maxx = 1;
        int m, n,k;
        scanf("%d%d%d", &m,&n,&k);
        int a;
        for(int i = 0; i < m; i++)
            for(int j = 0; j < n; j++)
            {
                scanf("%d", &a);
                if(a==0) matrix[i][j]=1;
                else matrix[i][j]=0;    
            }
            
        for(int i = 1; i < m; i++)
            for(int j = 1; j < n; j++)
                if(matrix[i][j] == 1)
                {
                    int mmin = min(matrix[i - 1][j], matrix[i][j - 1]);
                    mmin = min(matrix[i - 1][j - 1], mmin);
                    matrix[i][j] = mmin + 1;
                    if(maxx < matrix[i][j])
                        maxx = matrix[i][j];
                }
        if(maxx>=k) printf("Yes\n");
        else printf("No\n");    
    }
  
    return 0;
}