題目大意:輸入是具有n個整數的向量x,輸出是輸入向量的任何聯絡子向量中的最大和,並輸出該子向量的開始和結束為止。例如:
輸入:5 6 -1 5 4 -7
7 0 6 -1 1 -6 7 -5
輸出:case 1:14 1 4
case 2:7 1 6
分別有四種方法都能夠求解出來分別是o(n^3)和o(n^2)以及o(n)但是只有分治演算法和掃瞄演算法能夠ac,
前兩種都會超時。
《程式設計珠璣》裡面在第八章講這個問題時有一句經典的話:任何正確的演算法都必須至少花費o(n)的時間,
所以最後的掃瞄演算法已經很高效了,不需要優化了。
掃瞄演算法**如下複雜度o(n):
//time:328ms mem:548k
#include using namespace std;
int main()
if(ssum<0)
}cout<<"case "<
平法演算法(o(n^2)執行時會超時:
#include using namespace std;
int main()
sum[0]=0;
sum[1] = a[1];
for(int j=2; j<=n;j++)
sum[j] = a[j]+sum[j-1];
int max = a[0];
int ssum;
int locl=0,locr=0;
for(int i=1;i<=n;i++)}}
cout<<"case "<
動態規劃 最大子陣列
解題思路 對於這樣乙個連續和的問題 個人習慣叫做最大連續和 如果我們要用動態規劃來解,首先得考慮狀態和狀態轉移方程。如果我們把題述陣列看成序列,那麼是不是可以用序列dp來考慮呢?我們不妨考慮乙個這樣的序列 1,3,5,2,4 a i 表示這個序列的第 i 個元素,dp i 表示最後乙個元素是a i ...
動態規劃 最大子串行
描述 1.從給定序列中找出連續最大子串行,滿足子串行的和為最大值,返回該最大值 2.從給定序列中找出連續最大子串行,滿足子串行的積為最大值,返回該最大值 思想 第一題首先申請乙個變數curmax表示當前子串行累計和,初始化為0,res表示當前所有子串行和的最大值,初始化為最小值int min。從序列...
最大子矩陣(動態規劃)
最大矩陣和顧名思義,就是乙個矩陣和最大,例如下面的矩陣 0 2 7 0 9 2 6 2 41 41 1 80 2 最終找到了和為15的矩陣 9 2 41 18所選的矩陣沒有規定,只要在這個大矩陣中,就可以了,那麼我們需要限定它的行和列 我們用三個for迴圈把所有的行的情況列舉,分別是i,j,k i從...