動態規劃解最大回文子串行

2022-08-04 07:27:14 字數 1152 閱讀 5026

子串和子串行有區別,子串是連續的,子串行不一定連續。

例如字串 "bdsdksldjfkdls",它的乙個子串為"dsdk",它的乙個子串行為"bdklj"(1,2,5,7,9)。

一:刻畫最優解的結構特徵

假設序列為a,從a[i]到a[j]所包含的最大回文子串行的字元數為c[i,j],則所求的就是c[i,j]第一次取到最大值時的子串行。之所以是第一次取到最大值,是因為c[i,j+1]只可能大於等於c[i,j],若c[i,j]已經取到了最大值,那麼a[i]和a[j]就是最大回文子串行的首尾,a[j+1]則不在該子串行中。

二:遞迴定義最優解的值

最優解的值是c[i,j],最優解是子串行,這二者是不一樣的。

c[i,j] = c[i+1,j-1]+2 (a[i] = a[j])

c[i,j] = max(c[i+1,j],c[i,j-1]) (a[i] <> a[j])

三:採用自底向上法

這裡的自底向上和以前的不一樣。這裡c[i,j]依賴c[i+1,j],說明要先求出c[i+1,j],所以i應該是遞減的,即要先求出i=8,才能求出i=7。

四:構造最優解

構造需要最大子串行的首尾,最大子串行包含的字元數。

**如下:

#include

using namespace std;

#define max(x,y) ((x)>(y)?(x):(y))

char a[1024];

int c[100][100];

char b[1024];

int k = 0;

void cprint(int m, int n, int q);

int main()

else if(j < i)

else if(a[i] == a[j])  }

else

}        

}cout《列印最大回文子串行的函式採用遞迴的方式,如果a[i] = a[j],則列印a[i],如果不相等,則看是

c[i+1,j]大還是c[i,j-1]大,以此決定改捨棄a[i]還是a[j],然後遞迴呼叫列印函式,直到q = 0,說明前一半已經列印完了,再列印後一半,後一半是在列印前一半的時候已經儲存了。

void cprint(int m, int n, int q)

else

}

動態規劃 最長回文子串行

之前並沒有想過求解 最長回文子串行 的方法,但是自己想想也是沒有什麼好的辦法可以求出 最長回文子串行 來,而最近遇到了一道題目,在經過問題分析,轉化之後,其根本的問題就是 最長回文子串行 的求解問題。題意 兩隻兔子在乙個由n個數字組成的環上,乙隻只能順時針跳,另乙隻只能逆時針跳。跳的規則如下 1 以...

最大回文子串 (動態規劃)

建立乙個布林型的二維陣列dp,其中dp i j 表示字串第i到j是否為回文。那麼邊界值其實很清楚了,字串長度為1的都為true。狀態轉換如何設定呢?當字串i所在的字元 字串j所在的字元,且它的內部 dp i 1 j 1 為回文,那麼dp i j 為true 又或者當字串i所在的字元 字串j所在的字元...

動態規劃 最大上公升子串行

乙個數的序列bi,當b1 b2 bs的時候,我們稱這個序列是上公升的。對於給定的乙個序列 a1,a2,an 我們可以得到一些上公升的子串行 ai1,ai2,aik 這裡1 i1 i2 ik n。比如,對於序列 1,7,3,5,9,4,8 有它的一些上公升子串行,如 1,7 3,4,8 等等。這些子串...