。dp回文子串 通常在dp数组中存放的是 从i到j是否是回文子串
1.动态规划
2.中心扩展法
1 #include<iostream> 2 #include<algorithm> 3 #include<string> 4 using namespace std; 5 int dp[100][100] = { 0 }; 6 int main(void) 7 { 8 string s1; 9 while (cin >> s1) 10 { 11 int length = s1.length(); 12 int i; 13 for (i = 0; i <= length - 1; ++i) 14 dp[i][i] = 1; 15 int j; 16 for (i = length-1; i >=0; --i) 17 { 18 for (j = i+1; j <=length-1; ++j) 19 { 20 if (s1[i] == s1[j]) 21 { 22 dp[i][j] = dp[i + 1][j - 1] + 2; 23 } 24 else 25 { 26 dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]); 27 } 28 } 29 } 30 cout << "最长回文子序列的长度是"<<dp[0][length - 1] << endl; 31 } 32 return 0; 33 }
1 #include<iostream> 2 #include<algorithm> 3 #include<string> 4 using namespace std; 5 int dp[100][100] = { 0 }; 6 int main(void) 7 { 8 string s1; 9 while (cin >> s1) 10 { 11 int length = s1.length(); 12 int i; 13 for (i = 0; i <= length - 1; ++i) 14 dp[i][i] = 1; 15 int j; 16 for (i = length - 1; i >= 0; --i) 17 { 18 for (j = i + 1; j <= length - 1; ++j) 19 { 20 if (s1[i] != s1[j]) 21 { 22 dp[i][j] = dp[i + 1][j] + dp[i][j - 1] - dp[i + 1][j - 1]; 23 } 24 else 25 { 26 dp[i][j] = dp[i + 1][j] + dp[i][j - 1] - dp[i + 1][j - 1] + dp[i + 1][j - 1] + 1; 27 } 28 } 29 } 30 cout << "回文子序列的个数是"<<dp[0][length - 1] << endl; 31 } 32 return 0; 33 }
1 #include<iostream> 2 #include<algorithm> 3 #include<string> 4 using namespace std; 5 int dp[100]; //长度 6 bool ispalindrome(string s,int start,int end) 7 { 8 while (start <= end) 9 { 10 if (s[start] != s[end]) 11 { 12 return false; 13 } 14 ++start; 15 --end; 16 } 17 return true; 18 } 19 int main(void) 20 { 21 string s; 22 while (cin >> s) 23 { 24 int length = s.length(); 25 int i; 26 for (i = 0; i <= length; ++i) 27 { 28 dp[i] = i - 1; 29 if (ispalindrome(s, 0, i-1) == true) 30 { 31 dp[i] = 0; 32 } 33 } 34 int j; 35 for (i = 0; i <= length-1; ++i) 36 { 37 for (j = 0; j <= i; ++j) 38 { 39 if (ispalindrome(s, j, i) == true) 40 { 41 dp[i + 1] = min(dp[i + 1], dp[j] + 1); 42 } 43 } 44 } 45 cout << "需要分割的次数为" << dp[length] << "次"<<endl; 46 } 47 return 0; 48 }