题目传送门 http://poj.org/problem?id=1159
题意:给你一个字符串 然后让你在这个字符串中随意添加字母,让这个字符串变成回文字符串,问最少要添加几个字符;
一样为例 Ab3bd 可以看出中间三个 已经是回文的了 只要在两边各添加一个就行了 结果有 Adb3bdA dAb3bAd 都是需要添加两个字符 所以答案就是 2
这个和01背包还是有相似之处的,要么加字符,要么不加字符,不同的是多了一个判断,动态规划都是假设如果你i从0开始的话那么假设的就是后边的已经排好了,如果从n-1开始的话 假设的就是前面已经排好了,关键是dp的方程
for(i=n-1;i>=0;i--)
{
for(j=i+1;j<n;j++)
{
if(str[i]==str[j])
dp[i][j]=dp[i+1][j-1];
else
dp[i][j]=min(dp[i+1][j],dp[i][j-1])+1;
}
}
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char str[5100];
int n;
short dp[5100][5100];
int main()
{
while(~scanf("%d",&n))
{
int i,j;
scanf("%s",str);
for(i=n-1;i>=0;i--)
{
for(j=i+1;j<n;j++)
{
if(str[i]==str[j])
dp[i][j]=dp[i+1][j-1];
else
dp[i][j]=min(dp[i+1][j],dp[i][j-1])+1;
}
}
printf("%d\n",dp[0][n-1]);
}
}