原題連結
思路:
首先需要回求最大子序列的和,(不會的可以寫寫這個題最大欄位和)
然後這個題就是最大欄位和升級版(個人感覺)。
就是把這個二維的矩陣對列利用字首和進行降維
然後對得到的一維陣列進行dp(也就是動態規劃求最大值)
方法一:
點選檢視程式碼
#include <bits/stdc++.h>
#define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define rep(i,a,b) for(int i = (a); i <= (b); i++)
#define lop(i,a,b) for(int i = (a); i < (b); i++)
#define dwn(i,a,b) for(int i = (a); i >= (b); i--)
#define mset(t,x) memset(t,x,sizeof(t));
#define ll long long
#define el '\n'
using namespace std;
int n, ans;
int arr[125][125], brr[125], dp[125];
void Arrsum()
{
mset(dp, 0);
rep(i, 1, n) {
dp[i] += max(dp[i - 1] + brr[i], brr[i]);
ans = max(dp[i], ans);
}
}
void solve()
{
cin >> n;
//讀入資料
rep(i, 1, n)
rep(j, 1, n) cin >> arr[i][j];
rep(i, 1, n) {
//從第一行開始
mset(brr, 0);
//對列利用字首和進行降維
rep(j, i, n) {
rep(k, 1, n) {
brr[k] += arr[j][k];
}
Arrsum();//dp求最大值
}
}
cout << ans;//輸出結果
}
int main()
{
ios;
solve();
return 0;
}