Torus 二维最大矩阵的高效算法求解

发布于 2022-08-29 21:10:20 字数 1839 浏览 7 评论 0

题:10827 - UVa Online Judge

Torus 上二维最大矩阵已知有能达 O(n^3) 的方法,不知有没有更高效的算法?

算法复杂度为 O(N^4)

/*
 * Sai Cheemalapati
 * UVA 10827: Maximum sum on a torus
 * O(N^4) solution 
 */

#include<algorithm>
#include<cstdio>

using namespace std;

int T, N;
int A[500][500];

int main() {
    scanf("%d", &T);
    while(T--) {
        scanf("%d", &N);
        for(int i = 0; i < N * 2; i++) {
            for(int j = 0; j < N * 2; j++) {
                if(i < N && j < N) {
                    scanf("%d", &A[i][j]);
                    A[i + N][j] = A[i][j + N] = \
                        A[i + N][j + N] = A[i][j];
                }
                if(i > 0) A[i][j] += A[i - 1][j];
                if(j > 0) A[i][j] += A[i][j - 1];
                if(i > 0 && j > 0) A[i][j] -= A[i - 1][j - 1];
            }
        }
        int ans = -1000000;
        for(int i = 0; i < N; i++) {
            for(int j = 0; j < N; j++) {
                for(int k = i; k < i + N; k++) {
                    for(int l = j; l < j + N; l++) {
                        int cur = A[k][l];
                        if(i > 0) cur -= A[i - 1][l];
                        if(j > 0) cur -= A[k][j - 1];
                        if(i > 0 && j > 0)
                            cur += A[i - 1][j - 1];
                        ans = max(ans, cur);
                    }
                }
            }
        }
        printf("%d\n", ans);
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

凝望流年 2022-09-05 21:10:20

你基本可以认为目前靠谱的做法是O(n3)的。
虽然有一些论文在数字上稍微更好了一点,但是实际意义似乎不大(可能和我读书少有关系)

如果你有兴趣(看起来你是竞赛选手应该不会有兴趣)可以看论文,比如这个
Algorithms for the maximum subarray problem based on matrix multiplication

不过这篇可能不好找,A Sub-cubic Time Algorithm for the k-Maximum Subarray Problem里面有一部分讲了那个算法,这篇好像好找pdf。。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文