最大字段和
原题链接: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;
}
标签:int,res,矩阵,字段,区间,include,com,dp
From: https://www.cnblogs.com/KAI040522/p/18050182