子串和子串行有區別,子串是連續的,子串行不一定連續。
例如字串 "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 等等。這些子串...