Poj 1050 動態規劃

2021-07-25 18:33:20 字數 1016 閱讀 5619

題目大意:給乙個方矩陣,求解元素和最大的子矩陣。最終要求輸出最大和結果。

題目分析:一位陣列的最大和通過動態規劃是很好解決的,利用如下遞推公式即可: dp

[i]=

max

然而這是乙個二維的問題。

一開始,按照動態規劃的思想,我期望把問題歸結為乙個最優子問題,但是失敗了。後來把問題規劃為一維陣列解決,是很好的。具體做法是把矩陣的連續行加起來變成乙個一維陣列,求解最大子串和。以4*4的矩陣為例,連續行相加的可能有4+3+2+1種,分別是一行、兩行、三行、四行的情況。我們能夠得到10個一維陣列,對其進行最大子串和的求取,最終選取最大的結果即可。

思路清晰了,但是**還是很多次沒過,原因就是超時。

之前的思路是這樣的:迴圈i為一行、兩行、三行、四行的情況。內層迴圈j為結束行。定義乙個陣列b儲存結果,對於每一行的k列,k再進行乙個迴圈。然後第k個元素需要從j-i行加到j行,這又需要一層迴圈。一共是四層迴圈,這就肯定超時了。

後來改進了一下,變成了三層迴圈。重新定義了i和j,定義i為起始行,j為結束行。這樣i從1到n,j從i到n,就可以遍歷所有的情況。在ij內層定義乙個k迴圈,計算b[

k]+=

a[j]

[k] 。這樣隨著j增加,b[k]會變成多行之和,然後改變i的時候初始化一下b即可。這樣就變成三層迴圈了,順利通過。可見這個程式的設計還是需要多加考慮的。

#include 

#include

using

namespace

std;

int n;

int a[510][510];

int b[510];

int dp[510];

int ans = -9999;

int main()

}for (int i = 0; i < n; i++)}}

cout

<< ans << endl;

//system("pause");

return

0;}

poj 1050 動態規劃

題目 求最長序列的和的拓展,有一維拓展到二維,首先判斷每一行的最大值,然後記錄下最大的值,再將然後,把第i行後的各行對應列的元素加到第i行的對應列元素,每加一行,就求一次最大欄位和,這樣就把子矩陣的多行壓縮為一行了,一行了就是最大欄位和了啊!include include using namespa...

poj1050 (最大子矩陣和)

首先要熟悉一下最大子段和 即最大連續子串的和 給一串數字,找到最大子段和的值。一般方法是dp,dp i 表示以a i 為結尾的最大子段和,那麼dp i max dp i 1 a i a i 即,當dp i 1 0時,dp i a i 否則dp i dp i 1 a i 有了一維的基礎,現在來看看矩陣...

poj1050最大子矩陣和

這篇是看了別人的報告寫的,就當是屢屢思路好了.題目大意。給定乙個n階矩陣 方陣 每個元素中存在乙個數字.任務就是求出乙個最大的子矩陣使得矩陣元素之間的和是最大的.n 100 1.矩陣a m n 的和可以直接 sum a i j i 0 to n 1 j 0 to n 1 還可以求出第i列的和p i ...