dp 迴圈陣列的最大和

2022-06-27 09:21:09 字數 1418 閱讀 4192

時間限制:1000 ms  |  記憶體限制:65535 kb

難度:4

描述給定乙個由n個整數元素組成的陣列arr,陣列中有正數也有負數,這個陣列不是一般的陣列,其首尾是相連的。陣列中乙個或多個連續元素可以組成乙個子陣列,其中存在這樣的子陣列arr[i],…arr[n-1],arr[0],…,arr[j],現在請你這個acm_lover用乙個最高效的方法幫忙找出所有連續子陣列和的最大值(如果陣列中的元素全部為負數,則最大和為0,即乙個也沒有選)。

輸入輸入包含多個測試用例,每個測試用例共有兩行,第一行是乙個整數n(1=輸出

對於每個測試用例,請輸出子陣列和的最大值。

樣例輸入

6

1 -2 3 5 -1 2

56 -1 5 4 -7

樣例輸出

10

14題目分析 :

首先想到的肯定是將陣列擴大一倍, 將環變成鏈 , 但這裡還有乙個更巧妙的辦法, 就是此題的最終結果一定是由著兩種情況產生的, 一是 我不需要首尾相連,直接乙個串過去就有最大值,二是我需要首尾相接,

想一想 , 它為什麼需要首尾相接才有最大值? 不就是因為串的中間有一段最大 負串影響了第一種情況, 所以我可以求最大負串的和 。

**示例:

/*

* author: ry

* created time: 2017/9/19 8:09:07

* file name: 1.cpp

*/#include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

const int eps = 2e5+5;

const double pi = acos(-1.0);

#define max(a,b) a>b?a:b

#define min(a,b) a>b?b:a

#define ll long long

int pre[eps];

int dp[eps];

int main()

memset(dp, 0, sizeof(dp));

int ans = 0;

for(int i = 1; i <= n; i++)

int ans2 = 0;

memset(dp, 0, sizeof(dp));

for(int i = 1; i <= n; i++)

// if (ans > sum) printf("%d\n", sum);

printf("%d\n", max(ans, sum-ans2));

}return 0;

}

求子陣列的最大和 DP

題目 輸入乙個整形陣列,陣列裡有正數也有負數。陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和。求所有子陣列的和的最大值。要求時間複雜度為o n 輸入 例如輸入的陣列為1,2,3,10,4,7,2,5,和最大的子陣列為3,10,4,7,2 輸出 因此輸出為該子陣列的和18。解析 因為是...

演算法總結 DP 求子陣列的最大和

快要畢業了,逐步把之前做過的一些演算法和資料結構,專案相關資料總結整理一下,一來溫習一下之前的知識,二來記錄下學習點滴,方便之後的學習。plain view plain copy print?題目描述 給定乙個整數陣列,陣列中有正數也有負數,陣列中連續的乙個或者多個整數組成乙個子陣列,每個子陣列都有...

51nod 1050 迴圈陣列最大和

感覺自己的碼力還很差 思維愚鈍 一開始把他搞成2倍長度來做 然後列舉每乙個始點加長度為n的陣列跑乙個dp 這樣複雜度高達o n 2 實際上我們可以分析一下 這個max有可能在1 n內取到 也有在迴圈陣列中取到 所以我們先跑一段1 n的dp 記為ans1 然後我們跑一段迴圈陣列內的dp 記為ans2 ...