這是乙個典型的dp動態規劃解決的問題
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
static
const
string a = "abasdfggfdsafgdba";
static
const
int lena = a.length();
//遞迴求解
int byrecursion(int i, int j)
}int bydplps()
for (int i = 0; ifor (int j = 0; j1 : 0;
flag[i][j] = 0;}}
//其實思路和最大公共子串行是一樣的,不一樣的是下面迴圈的設計
//cal[i][j]表示從i到j的子串行是否是回文字串
//cal[i][j]=cal[i+1][j-1]+2; 表明i是一來後面的元素i+1,所以i要倒序
//j是依賴前面的元素,所以要順序遍歷
for (int i = lena - 1; i >= 0; i--)
else
if (cal[i + 1][j] > cal[i][j - 1])
else}}
int maxlen = cal[0][lena - 1];
char* res = new
char[maxlen + 1];
res[maxlen] = '\0';
int k = maxlen - 1;
int h = 0;
int i = 0, j = lena - 1;
while (h <= k)
else
if (flag[i][j] == 2)
i++;
else
j--;
}cout
<< "lps is following:"
<< endl << res << endl;
for (int i = 0; idelete cal[i], flag[i];
delete cal, flag, res;
return maxlen;
}int main()
最大回文子串行 最大回文子串
最大回文子串行,例如cafgfkc,最大回文子串行cfgfc,輸出5。子串行相當於刪除某些位置上的字元後形成的序列。最大回文子串,例如cafgfkc,最大回文子串fgf,輸出3。子串相當於擷取start位到end位的子串。試過沒認真看題目,原題是求子序列,想當然以為求子串,直接高高興興用manach...
最大回文子串行數
time limit 1000ms memory limit 65536k description 給定字串,求它的回文子串行個數。回文子串行反轉字元順序後仍然與原序列相同。例如字串aba中,回文子串行為 a a aa b aba 共5個。內容相同位置不同的子串行算不同的子串行。input 第一行乙...
動態規劃解最大回文子串行
子串和子串行有區別,子串是連續的,子串行不一定連續。例如字串 bdsdksldjfkdls 它的乙個子串為 dsdk 它的乙個子串行為 bdklj 1,2,5,7,9 一 刻畫最優解的結構特徵 假設序列為a,從a i 到a j 所包含的最大回文子串行的字元數為c i,j 則所求的就是c i,j 第一...