P1719 最大加權矩形

樱岛麻衣的鹿發表於2024-04-28

原題連結

思路:

首先需要回求最大子序列的和,(不會的可以寫寫這個題最大欄位和
然後這個題就是最大欄位和升級版(個人感覺)。
就是把這個二維的矩陣對列利用字首和進行降維
然後對得到的一維陣列進行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;
}

相關文章