HDU 1559(最大子矩陣)

動態規劃題,設 dp[i][j] 表示從 (1, 1) 開始,i 行,j 列的矩陣元素之和,則 dp[i][j] = dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1] + num[i][j]。

每次輸入新元素時,計算以該元素爲右下角,x 行,y 列的矩陣元素之和,並更新子矩陣最大元素之和。

#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 1005;

int dp[MAXN][MAXN];

int main()
{
    int T;
    cin >> T;
    while (T--)
    {
        int m, n, x, y;
        cin >> m >> n >> x >> y;
        int maxSum = 0; //子矩陣最大元素之和
        for (int i = 1; i <= m; i++)
        {
            for (int j = 1; j <= n; j++)
            {
                cin >> dp[i][j];
                dp[i][j] += dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1];
                if (i >= x && j >= y) //計算以(i,j)爲右下角,x行,y列的矩陣元素之和
                    maxSum = max(maxSum, dp[i][j] - dp[i - x][j] - dp[i][j - y] + dp[i - x][j - y]);
            }
        }
        cout << maxSum << endl;
    }
    return 0;
}

繼續加油。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章