最長公共子串行問題

2021-06-04 13:34:36 字數 2661 閱讀 1922

給定整數a1,a2,…,an(可能有負值),求連續子串行和的最大值。(為方便起見,如果所有整數都為負值,則最大子串行和為0)

這是個顯而易見的方法,幾乎每個人在第一眼看到該問題都能夠想出來的方法。就是將所有的子串行找出來,然後求和最大的乙個。如果序列足夠大,該方法的效率可想而知。

**如下:

#include #include using namespace std;

typedef vectorvect;

int maxsubsum1(const vect &ivec, int &begin, int &end);//begin和end帶回最大子串行的起點和終點

int main(void)

;vect ivec(a, a + sizeof(a)/sizeof(int));

int begin, end;

int maxsum = maxsubsum1(ivec, begin, end);

cout << maxsum << endl;

if(begin == 0 && end == 0)

else

system("pause");

return 0;

}int maxsubsum1(const vect &ivec, int &begin, int &end)//begin和end帶回最大子串行的起點和終點

} }

return maxsum;

}

採用分治的方法,將這個序列分為大小相等的兩個子串行,其最大子串行和必然為:前乙個子串行中的最大子串行、後乙個子串行中的最大子串行和前半部分最大和(包括前半部分的最後乙個元素)加上後半部分最大和(包括後半部分的第乙個元素)這三者之一。

**如下:

#include #include using namespace std;

typedef vectorvect;

typedef vector::size_type sizet;

int maxsubsum2(vect &ivec, sizet left, sizet right);

int main(void)

; vect ivec(a, a + sizeof(a)/sizeof(int));

int maxsum = maxsubsum2(ivec, 0, ivec.size()-1);

cout << maxsum << endl;

system("pause");

return 0;

}int maxsubsum2(vect &ivec, sizet left, sizet right)

else

}sizet mid = (left + right) / 2;

int leftmaxsum = (ivec, left, mid);

int rightmaxsum = (ivec, mid+1, right);

int leftbordermaxsum = 0, leftbordersum = 0;

for(sizet i = mid; i >= left; --i)

/*i為unsigned int型,無論如何都不可能小於0,

*如果沒有這個if語句,怎麼都無法跳出迴圈,程

*序崩潰

*/if(i == 0)

break;

}int rightbordermaxsum = 0, rightbordersum = 0;

for(sizet i = mid+1; i <= right; ++i)

}if(leftmaxsum > rightmaxsum)

else

return 0;

}

採用動態規劃的思想。

**如下:

#include #include using namespace std;

typedef vectorvect;

typedef vector::size_type sizet;

int maxsubsum3(const vect &ivec, int &begin, int &end);//begin和end帶回最大子串行的起點和終點

int main(void)

; vect ivec(a, a + sizeof(a)/sizeof(int));

int begin, end;

int maxsum = maxsubsum3(ivec, begin, end);

cout << maxsum << endl;

if(begin == 0 && end == 0)

else

system("pause");

return 0;

}int maxsubsum3(const vect &ivec, int &begin, int &end)//begin和end帶回最大子串行的起點和終點

if(temp < 0)

}return maxsum;

}

最長公共子串行問題

最長公共子串行問題很早就在很多論壇上見過,前幾天看到乙個人發了一篇帖子,心血來潮就去看演算法導論上的動態規劃部分,關於這個問題不再細述,直接貼c 實現的具體 了。做大公共子串行問題 pragma once include using std string define over 1 書中使用箭頭符號...

最長公共子串行問題

問題描述 字串行的子串行是指從給定字串行中隨意地 不一定連續 去掉若干個字元 可能乙個也不去掉 後所形成的字串行。令給定的字串行x x0,x1,xm 1 序列y y0,y1,yk 1 是x的子串行,存在x的乙個嚴格遞增下標序列,使得對所有的j 0,1,k 1,有xij yj。例如,x abcbdab...

最長公共子串行問題

最長公共子串行問題是使用動態規劃的典型應用 解決此問題需要定義二維輔助陣列 dp m 1 n 1 其基本公式 最後通過回溯,找到其公共子串行 回溯方法如下 此圖摘自 例項程式如下 include include include includeusing namespace std int max i...