最大欄位和小結 DP

2021-06-18 11:48:06 字數 839 閱讀 7466

詳情可以看這裡的講解,很詳細

poj2479 模板題,即求兩個段的最大子段和

//poj2479

/*dp[i][j]表示包含第i個數的前i個數劃分為j個子段和的最大值

●dp[i][j] = max

(j-1<=k#include #define inf 10000000

using namespace std;

int dp[50010],f[50010];

int a[50010];

int max(int a,int b)

int min(int a,int b)

dp[0] = f[0] = 0;

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

for(int j=min(i,2);j>=1;j--)//2換成m段就變成求幾段

printf("%d\n",dp[2]);//cout<

a11  a12  a13

a21  a22  a23

a31  a32  a33

如圖,先求第一行最大子段和,再求第一行跟第二行合起來的最大子段和,如a21+a11, a22+a12, a23+a13 的最大子段和,再求第一到第三合起來的最大子段和,如a11+a21+a31,  a12+a22+a32, a13+a23+a33的最大子段和…..以此類推,直到求出整個矩陣的合起來的最大子段和,求出他們之中最大的那個和就是解.

//toj1564

#include#include#include#include#define max 105

using namespace std;

int main()

for(int m=0;m

最大欄位和(dp)

設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 ...

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,...