您的位置:首页 > 其它

poj 1159 Palindrome dp 字符串

2014-08-05 09:34 615 查看
题目传送门 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]);
}
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dp 字符串 poj 01背包