动态规划 P1115 最大子段和 最大子矩阵和(ZOJ 1074 TO THE MAX )

https://www.luogu.com.cn/problem/P1115

#include <bits/stdc++.h>
using namespace std;
int n,ans=INT_MIN,f,a;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a;
		f=max(f+a,a);
		ans=max(ans,f);
	}
	cout<<ans<<endl;
	return 0;
}

最大子矩阵和(ZOJ 1074 TO THE MAX )
https://pintia.cn/problem-sets/91827364500/exam/problems/type/7?problemSetProblemId=91827364573
题目:
有一个包含正数和负数的二维数组。一个子矩阵是指在该二维数组里,任意相邻的下标是1×1或更大的子数组。一个子矩阵的和是指该子矩阵中所有元素的和。
本题中,把具有最大和的子矩阵称为最大子矩阵。例如,如下数组的最大子矩阵位于左下角,其和为15。

输入
是N×N个整数的数组。第一行是一个正整数N,表示二维方阵的大小。接下来是N2个整数(由空格和换行隔开)。该数组的N2个整数,是以行序给出的。先是第一行的数,由左到右;然后是第二的数,由左到右,等等。N可能达到100,数组元素的范围是[-127,127]。

输出:
输出是最大子矩阵的和。

思路:
1、此问题是“最大字段和”问题的推广。

#include <bits/stdc++.h>
using namespace std;
const int N=110;
int ans=INT_MIN;
int n;
int a[N][N],sum[N][N];
void add_sum(int i,int j){
	sum[i][j]=a[i][j]+sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>a[i][j];
			add_sum(i,j);
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=i;j<=n;j++){
			int f=0;
			for(int k=1;k<=n;k++){
				int now=sum[k][j]-sum[k][i-1]-sum[k-1][j]+sum[k-1][i-1];
				f=max(f+now,now);
				ans=max(ans,f);
			}
		}
	}
	cout<<ans<<endl;
	return 0;
}

posted @ 2025-07-08 12:56  katago  阅读(8)  评论(0)    收藏  举报