应该DP是可以的,没想出来,直接暴力了,6层for。。。900ms
-
题目描述:
-
一个N*M的矩阵,找出这个矩阵中所有元素的和不小于K的面积最小的子矩阵(矩阵中元素个数为矩阵面积)
-
输入:
-
每个案例第一行三个正整数N,M<=100,表示矩阵大小,和一个整数K
接下来N行,每行M个数,表示矩阵每个元素的值
-
输出:
-
输出最小面积的值。如果出现任意矩阵的和都小于K,直接输出-1。
-
样例输入:
-
4 4 10 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
-
样例输出:
-
1
-
-
#include <stdio.h> #define INF 0x7FFFFFFF int buf[110][110]; int n,m,k; int i,j,a,b,c,d; int main() { //freopen("Test.txt","r",stdin); while(scanf("%d%d%d",&n,&m,&k) != EOF) { for(i = 1; i <= n; i++) for(j = 1; j <= m; j++) scanf("%d",&buf[i][j]); int ans = INF; for(i = 1; i <= n; i++) //i,j作为子矩阵的右下角点 { for(j = 1; j <= m; j++) { for(a = 1; a <= i; a++) //a,b作为子矩阵的左上角点 { for(b = 1; b <= j; b++) { int sum = 0; int tmp = (i-a+1) * (j-b+1); if(tmp > ans) continue; for(c = a; c <= i; c++) { for(d = b; d <= j; d++) { sum += buf[c][d]; } } //printf("%d ",sum); if(sum >= k && ans > tmp) ans = tmp; } } } } if(ans == INF) printf("-1\n"); else printf("%d\n",ans); } return 0; } /************************************************************** Problem: 1102 User: ronixy Language: C++ Result: Accepted Time:900 ms Memory:1068 kb ****************************************************************/