/*
* 给一个字符串s,求出需要最少添加多少个字符才能够使其成为回文串。
* 例如:输入 abc,则需要添加两个字符, abcba, 则输出2;
* 输入 aabb,则需要添加两个字符,2
*
* 解题思路: DP
* 分类讨论首字符与尾字符
* 1) 若首尾字符相等,则问题变为求 S[2]~S[len-1] 字符串的解;
*
* 2) 若首尾字符不相等,且首字符不和串内的任一个字符匹配,则在末尾添加一个与首字符
* 相同的字符,然后解为 1 + S[2]~S[len] 字符串的解
*
* 3) 若首尾字符不相等,且首字符和串内的一个字符匹配,则该情况等同于尾字符不和串内字符
* 匹配,则解为 1 + S[1]~S[len-1] 字符串的解
*
*/
代码如下所示:
#include <iostream>
using namespace std;
const int maxn = 1000; //假定字符串最大长度为1000
const int inf = 10000; //表示无穷大
char s[maxn]; //存储字符串
int dp[maxn][maxn]; //dp[x][y],x代表长度为x的子字符串,y代表从字符串第几个位置开始
void solve()
{
int slen