2794 - 挖宝藏
时间限制 : 1 秒
内存限制 : 128 MB
某片矿区含有丰富的矿产资源,有金银铜铁锡等,还有钻石呢。很多人前去淘金。你现在手上有一笔资金,可买到该矿山面积为S平方米的地域进行开采,你通过秘密途径搞到一份绝密资料,那就是该矿山的资源分布图。有了这些资料后,你准备买下哪块地进行开采,才能得到最大的效益。
题目输入
第一行为一个整数N(N<=100),表示矿山的边长。接下来是矿山的资源分布图,按单位平方米标记了每个点开采的价值,若为负数,表示开采将会亏本。最后一行为一个整数S,表示你可开采的面积(S<10000)
题目输出
输出开采后你的最大收益,注意你最大可以买S,你也可以买小于S的面积。为了规划,买的地域必须成矩型。
输入/输出样例
输入格式
3 1 2 3 -1 2 4 -3 -2 3 4
输出格式
11
C++解答
#include <cstdio> #define maxn 101 int n , S , ans = 0 ; int sum[maxn][maxn] = {0} ; int main() { scanf("%d", &n ); int t ; for (int i = 1 ; i <= n ; i ++ ) { for (int j = 1 ; j <= n ; j ++ ) { scanf("%d", &t ) ; for (int p = i ; p <= n ; p ++ ) { for (int q = j ; q <= n ; q ++ ) { sum[p][q] += t ; //printf("s[%d][%d] = %d\n",p,q,sum[p][q]); } } } } scanf("%d", &S ) ; if (S > n*n) S=n*n; for (int s = 1 ; s <= S ; s ++ ) { for (int a = 1 ; a <= s ; a ++ ) { int b = s/a ; if (a*b != s) continue ; for (int i = 1 ; i <= n-a+1 ; i ++ ) { for (int j = 1 ; j <= n-b+1 ; j ++ ) { int i2 = i+a-1 , j2 = j+b-1 ; int t = sum[i2][j2]-sum[i-1][j2]-sum[i2][j-1]+sum[i-1][j-1]; if (t > ans) ans = t ; } } } } printf("%d\n",ans); return 0 ; }