【矩陣】【hdu 薛貓貓004】
阿新 • • 發佈:2018-11-19
題目:
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; }