标签:style blog http color os ar for sp div
题意:给定n,m<=300的矩阵,然后求一个长宽大于2的矩形,使得是从左上角位置开始逆时针绕边框一圈的时间最少。时间的计算是:给定3个数tu,tp, td,路径上数字增加为tu,相等为tp否则为td。
思路:直接预处理出4个数组,然后直接暴力。n4的方法。但是常数小可以4000+ms过。
还有一种n3logn的方法。。
具体是固定右下角,然后枚举右上角,然后通过一个通过地推维护一个前缀,二分查找。。
不过常数肯定比暴力大估计快不了多少。。
code:
1 #include <bits/stdc++.h> 2 #define M0(x) memset(x, 0, sizeof(x)) 3 #define repf(i, a, b) for(int i = (a); i <= (b); ++i) 4 #define repd(i, a, b) for(int i = (a); i >= (b); --i) 5 using namespace std; 6 int U[303][303], D[303][303], L[303][303], R[303][303], a[303][303]; 7 int n, m; 8 int tp, tu, td, t; 9 10 inline int f(const int& a, const int& b){ 11 return a == b ? tp : (a > b ? tu : td); 12 } 13 14 void init(){ 15 scanf("%d%d%d", &tp, &tu, &td); 16 M0(U), M0(D), M0(L), M0(R), M0(a); 17 repf(i, 1, n) repf(j, 1, m) scanf("%d", &a[i][j]); 18 repf(i, 1, n) repf(j, 1, m){ 19 D[i][j] = D[i-1][j] + f(a[i][j], a[i-1][j]); 20 R[i][j] = R[i][j-1] + f(a[i][j], a[i][j-1]); 21 } 22 repd(i, n, 1) repd(j, m, 1){ 23 U[i][j] = U[i+1][j] + f(a[i][j], a[i+1][j]); 24 L[i][j] = L[i][j+1] + f(a[i][j], a[i][j+1]); 25 } 26 } 27 28 void solve(){ 29 int ansd = 0x3fffffff, ans = 0; 30 int lx, ly, rx, ry, d; 31 int tmp; 32 for (int x = 1; x <= n; ++x) 33 for (int y = 1; y <= m; ++y) 34 for (int x1 = x + 2; x1 <= n; ++x1) 35 for (int y1 = y + 2; y1 <= m; ++y1){ 36 tmp = D[x1][y1] - D[x][y1] + U[x][y] - U[x1][y]; 37 tmp += (R[x][y1] - R[x][y] + L[x1][y] - L[x1][y1]); 38 d = abs(tmp - t); 39 if (d < ansd || (d == ansd && tmp < ans)){ 40 lx = x, ly = y; 41 rx = x1, ry = y1; 42 ansd = d, ans = tmp; 43 } 44 } 45 // cout <<ans << endl; 46 printf("%d %d %d %d\n", lx, ly, rx, ry); 47 } 48 49 int main(){ 50 // freopen("a.in", "r", stdin); 51 while (scanf("%d%d%d", &n, &m, &t) != EOF){ 52 init(); 53 solve(); 54 } 55 return 0; 56 }
标签:style blog http color os ar for sp div
原文地址:http://www.cnblogs.com/yzcstc/p/4067588.html