您的位置:首页 > 其它

POJ1159 Palindrome(dp)

2013-07-11 19:48 316 查看
题目链接

分析:

感叹算法的力量。

方法一:

设 dp[i][j] 为字符串 s, 从 i 到 j 需要添加的最少字符数。

那么如果 s[i] == s[j], dp[i][j] = dp[i+1][j-1]. 如果 s[i] != s[j], dp[i][j] = min(dp[i+1][j], dp[i][j-1]) + 1.

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <map>

using namespace std;

const int maxn = 5000+10;

int dp[2][maxn];
char s1[maxn], s2[maxn];

int main(){
int n;

while(scanf("%d", &n) == 1) {
scanf("%s", s1);

memset(dp[0], 0, sizeof(dp[0]));
for(int i=0; i<n; i++) {
s2[n-i-1] = s1[i];
}
s2
= '\0';

for(int i=1; i<=n; i++) {
for(int j=1; j<=n; j++) {
if(s1[i-1] == s2[j-1]) dp[i%2][j] = dp[(i-1)%2][j-1] + 1;
else dp[i%2][j] = max(dp[(i-1)%2][j], dp[i%2][j-1]);
}
}

printf("%d\n", n-dp[n%2]
);
}

return 0;
}


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