全部评论 1

  • 其实我有原稿:

    先给代码在逐个解释:

    #include<bits/stdc++.h>
    using namespace std;
    long long kadane(const vector<long long>& arr) {
    	long long maxSoFar = arr[0];
    	long long maxEndingHere = arr[0];
    	for (size_t i = 1; i < arr.size(); ++i) {
    		maxEndingHere = max(arr[i], maxEndingHere + arr[i]);
    		maxSoFar = max(maxSoFar, maxEndingHere);
    	}
    	return maxSoFar;
    }
    long long globalMax = LLONG_MIN;
    int main() {
    	int size;
    	cin >> size;
    	vector<vector<long long>> Array(size, vector<long long>(size));
    	for (int i = 0; i < size; i++) {
    		for (int j = 0; j < size; j++) {
    			cin >> Array[i][j];
    		}
    	}
    	for (int top = 0; top < size; top++) {
    		vector<long long> colsum(size, 0);
    		for (int bottom = top; bottom < size; bottom++) {
    			for (int ip = 0; ip < size; ip++) {
    				colsum[ip] += Array[bottom][ip];
    			}
    			long long currentValue = kadane(colsum);
    			globalMax = max(globalMax, currentValue);
    		}
    	}
    	cout << globalMax;
    }
    

    这里首先讲一下kadane算法是怎样的:
    kadane算法就像是去让你投股票,你会实时决定是否要让它继续在这条股上继续随着股而波动,或者立即收杆重投。
    核心口诀就像入xia:
    每天算两笔账:
    ① 带上昨天一起干能赚多少?
    ② 今天单干能赚多少?
    一定选大的那个!
    同时记下历史最高赚了多少。”
    比如说你有一个数组长的是这样:
    2 -4 3 -1 2 -4 3
    然后就是这样的过程:
    第一次:只有2得选,现在最高是2
    第二次:要是这两天的和一块就是2-4=-2,而要是直接从-4重来可是亏大了的,这里就选择-2,不比之前高
    第三次:如果我再把之前的在加过来,算得3-2=-1,但是这次单干就是直接从3开始了,比-1和之前都要高,直接重投好吧,所以这里选3,这里最高是3
    第四次:我今天把上次的3和今天的变化加过来就是3-1=2,要是重投就是-1了,所以我还是选择继续现在的吧,选2,不比之前高.
    · · · · · ·
    一直到最后,你就会找到一个最大值,是4了你肯定know的
    有的人就会说:如果全是持续(比如 [-5, -2, -8]),怎么办?那就选亏得最少的那次嘛!
    第1天:-5接着设当前=-5,然后最高=-5
    第2天:max(-5-2, -2) = -2 然后再判断,最高 = max(-5, -2) = -2
    第3天:max(-2-8, -8) = -8 ,最高还是 -2
    答案就该是-2
    然后又有的人要问:为什么不能初始化 历史最高为0?
    因为题目要求必须选至少连续是一个的,如果全负数,答案就不可能是 0,那就是很错的。

    * **本题分析**
    然后这里这题的思路是通过枚举和压缩来使上下边界的每种情况都被考虑到,接着压缩(对于每一对 (top, bottom),计算每一列在这些行上的总和,形成一个一维数组。这个步骤将原本的二维问题简化为一维问题,便于后续处理。),降维后用**Kadane**来做到寻找左右边界的作用(本质其实这个就是在每次横着切片在压成一维时可以在片段中找到最大值)
    
    由此我们可以先写一个Kadane函数方便后续使用:
    
    ```cpp
    long long kadane(const vector<long long>& arr) {
    	long long maxSoFar = arr[0];
    	long long maxE

    2025-12-12 来自 广东

    0
暂无数据

提交答案之后,这里将显示提交结果~

首页