最大字段和,区间矩阵

最大字段和

原题链接:P1115 最大子段和 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

解析:经典动态规划:最大子数组问题 - 知乎 (zhihu.com)

我写的代码:

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 2e5 + 10;
int a[N], dp[N];
int main()
{
	memset(dp, 0, sizeof(dp));
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	int n;
	cin >> n;
	//dp[0] = a[0];
	int res = -0x3f3f3f3f;
	for (int i = 1;i <= n;i++) {
		cin >> a[i];
		dp[i] = max(a[i], a[i] + dp[i-1]);
		res = max(dp[i], res);
	}
	//for (int i = 0;i < n;i++)
	//	res = max(dp[i], res);
	cout << res << endl;
	return 0;
}

最大加权矩阵

原题链接:P1719 最大加权矩形 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

解析:1.p1719最大加权矩形--前缀和+贪心+DP+矩阵压缩 - 知乎 (zhihu.com)

我的代码:

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 150;
int n;
int a[N][N], dp[N], t[N];
int ans = -0x3f3f3f3f;

void sum() {
	memset(dp, 0, sizeof(dp));
	dp[0] = t[0];
	for (int i = 1;i <= n;i++) {
		dp[i] = max(dp[i], dp[i - 1] + t[i]);
		ans = max(ans, dp[i]);
	}
}
void arr() {//压缩矩阵
	for (int i = 1;i <= n;i++) {
		memset(t, 0, sizeof(t));
		for (int j = i;j <= n;j++) {//遍历所选矩阵的行
			for (int k = 1;k <= n;k++)//遍历矩阵的列,变成一维,的列值
				t[k] += a[j][k];
			sum();
		}
		
	}
}
int main()
{
	cin >> n;
	for (int i = 1;i <= n;i++)
		for (int j = 1;j <= n;j++)
			cin >> a[i][j];
	arr();
	cout << ans << endl;
	return 0;
}
posted @ 2024-03-03 16:08  W_K_KAI  阅读(19)  评论(0)    收藏  举报