最大子段和(順序求和 比較 分治策略 動態規劃)

2021-10-04 20:35:52 字數 2458 閱讀 5838

1.順序求和+比較

int

maxsum

(int n,int

*a,int

& besti,int

& bestj)

}return sum;

}

顯然用該方法時間複雜度o(n³)改進:

int

maxsum

(int n,

int*a,

int&besti,

int&bestj)}}

return sum;

}

時間複雜度變為o(n²)2.分治法

}時間複雜度為o(nlogn)

int

maxsum

(int n,

int a)

return sum;

}

推廣題1:最大子矩陣和

問題描述:給定乙個m行n 列的整數矩陣a,試求矩陣a 的乙個子矩陣,使其各元素之和為最大。

}(法一)

#include

using

namespace std;

const

int n=

1e4;

int a[n]

[n];

intmaxsum

(int n,

int*c)

return sum;

}int

maxsum2

(int m,

int n)

}return sum;

}int

main()

} cout<<

maxsum2

(m,n)

<

}

(法二)

#include

using

namespace std;

int*

*a;//仍採用動態分配模式

intmaxsum

(int n,

int*c)

return sum;

}int

maxsum2

(int m,

int n)

}return sum;

}int

main()

} cout<<

maxsum2

(m,n)

<

}

推廣題2:求最大m子段和
#include

using

namespace std;

typedef

long

long ll;

const

int n=

1e4+5;

const

int inf=

0x3f3f3f3f

;int n,m;

ll a[n]

,dp[2]

[n];

intmain()

} ll ans=

-inf;

for(

int i=m;i<=n;i++

)

ans=

max(ans,dp[m&1]

[i])

;printf

("%lld\n"

,ans);}

}

最大子段求和

includeusing namespace std int main if temp 0 捨棄之前的子段 cout 舉個例子,a 4 顯然最大子段和是 9 2 11 該 從頭到尾掃瞄一次,如果只有一項,則最大子段和是它本身,不管是否為負數還是正數。假設第二項為正數的話,顯然最大子段和就是第二項本身...

分治策略之最大子陣列

分治策略是將父問題差分成的多個子問題,然後遞迴的方式解決子問題。整個思想和動態規劃類似,不過分治策略不要求最優解問題,而只是把父問題分解成子問題。步驟 分解 divide 先將問題劃分成子問題。子問題的形式與原問題相同。解決 conquer 遞迴解決問題,當問題縮小到一定程度就能夠直接求解。合併 c...

分治策略 求最大子陣列

只有當陣列中包含負數時,最大子陣列問題才有意義。如果所有元素都是非負的,最大子陣列問題沒有任何意義,因為整個陣列和肯定是最大的 1 public class findmaxsubarraydemo 4int result arr findmaximumsubarray arr,0,arr.lengt...