您的位置:首页 > 其它

uva10453

2016-03-01 21:55 351 查看
题目大意:

可以增加字符,求使已给字符串变成回文需要添加的最少字符

思路:

DFS + DP

当两个字母相等的时候,可以选择dp[m]
= dp[m + 1][n - 1]。

也可以选择dp[m]
= min(dp[m + 1]
,dp[m][n -1]) + 1;

选择这两种中比较小的一个。

而如果两个字母不相等的时候只有一种选择。

dp[m]
=min(dp[m + 1]
,dp[m][n - 1]) + 1;

代码:

#include <iostream>
using namespace std;
#include <stdio.h>
#include <cstring>
const int maxn = 1010;
const int INF = 0x7ffffff;
int dp[maxn][maxn];//表示i到j的最少操作的次数
char s[maxn];
int dfs(int m,int n) {
if(m >= n) return 0;
if(dp[m]
!= INF) return dp[m]
;
if(s[m] == s
)
dp[m]
= min(dfs(m + 1,n - 1),min(dfs(m, n - 1),dfs(m + 1,n)) + 1);
else
dp[m]
= min(dfs(m, n - 1),dfs(m + 1, n)) + 1;
return dp[m]
;

}
void print(int m,int n) {
if(m > n)
return ;
if(m == n) {
printf("%c",s[m]);
return ;
}
if(s[m] == s
) {
printf("%c",s[m]);
print(m + 1, n - 1);
printf("%c",s
);
}
else if(dp[m]
== dp[m + 1]
+ 1) {
printf("%c",s[m]);
print(m + 1,n);
printf("%c",s[m]);
}
else {
printf("%c",s
);
print(m,n - 1);
printf("%c",s
);
}
}
int main() {

while(scanf("%s",s) != EOF) {
int len = strlen(s);
for(int i = 0; i < len; i++) {
for(int j = 0; j < len ; j++)
dp[i][j] = INF;
}
printf("%d ",dfs( 0 ,len - 1));
print(0,len - 1);
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: