POJ 1159

来源:互联网 发布:皂基洗面奶知乎 编辑:程序博客网 时间:2024/06/05 13:22
原题网址:http://poj.org/problem?id=1159
题意:给一个字符串,求最少插入多少个字符可以使之变成回文串
题目分类:区间dp
状态转移方程:dp[i][j]=dp[i+1][j-1] (str[i]==str[j)
dp[i][j]=min(dp[i+1][j],dp[i][j-1])   (str[i]!=str[j])

注意:此题要用到滚动数组,直接开int二维数组会MLE(换成short就不会MLE,汗),在用滚动数组时要状态转移要从后往前推,不然之前的状态会被覆盖掉,

ac代码:

#include <cstdio>#include <iostream>#include <cstring>using namespace std;const int M=5000+5;char str[M];short dp[2][M];int n;int main(){while(~scanf("%d",&n)){scanf("%s",str);memset(dp,0,sizeof(dp));for(int i=n-2;i>=0;i--){for(int r=1;r<=n;r++){int j=i+r;if(str[i]==str[j]){if(i+1>=j-1)dp[i%2][j]=0;elsedp[i%2][j]=dp[(i+1)%2][j-1];}else{if(i+1>=j)dp[i%2][j]=1;elsedp[i%2][j]=min(dp[i%2][j-1]+1,dp[(i+1)%2][j]+1);}}}printf("%d\n",dp[0][n-1]);}return 0;}


0 0
原创粉丝点击