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