最大欄位和(dp)

2021-10-23 07:10:28 字數 1444 閱讀 5859

設a【i】,dp【i】

我們在選擇乙個元素a[j]的時候,只有兩種情況,將a[i]至a[j-1]加上,或者從a[j]以j為起點開始。我們用乙個陣列dp[i]表示以i為結束的最大子段和,對於每乙個a[i],加上dp[i-1]成為子段,或以a[i]開始成為新段的起點。因為我們只需要記錄dp值,所以複雜度是o(n)。由此可得遞推公式

dp[i] = a[i] dp[i - 1] <0;

dp[i] = dp[i - 1] + a[i] dp[i - 1] >= 0;

dp[i ] = a[0] i == 0;

如果不用求最大子段和的起始和終止位置,可以進行空間優化

模板題51nod1049

//最大欄位和dp

//最大欄位和dp

#include

using

namespace std;

const

int maxn =

50000+7

;typedef

long

long ll;

ll arr[maxn]

;ll maxsum

(int n)

else

ans =

max(dp,ans);}

return ans;

}int

main()

ll ans =

maxsum

(n);

cout<}return0;

}

這裡給出乙個求最大欄位和以及起始和終止點位置的例題hdu 1003

用陣列dp【i】表示以i結束的最大欄位和

//最大欄位和dp

#include

#include

#define maxn 100000 + 10

#define ll long long

using

namespace std;

ll arr[maxn]

,dp[maxn]

,tend,start;

ll maxsum

(int n)

else

if(ans < dp[i])}

start = tend;

for(

int i = start -

1; i >=

0; i--

)else

}return ans;

}int

main()

ll ans =

maxsum

(n);

cout<<

"case "

<":"

' '<10)

count++;}

return0;

}

最大欄位和小結 DP

詳情可以看這裡的講解,很詳細 poj2479 模板題,即求兩個段的最大子段和 poj2479 dp i j 表示包含第i個數的前i個數劃分為j個子段和的最大值 dp i j max j 1 k include define inf 10000000 using namespace std int d...

DP 分治 最大字段

首先用分治法 include stdio.h int maxsum int a,int left,int right for i center 1 i right i sum s1 s2 if sumvoid main 然後是動態規劃方法 include stdio.h int maxsum int...

最大欄位和

include include include include include using namespace std 最大欄位和問題描述 給定n個整數 可能為負數 組成的序列a 1 a 2 a 3 a n 求該序列如a i a i 1 a j 的子段和的最大值。當所給的整均為負數時定義子段和為0,...