uva10453

来源:互联网 发布:java springmvc 分页 编辑:程序博客网 时间:2024/06/05 11:11

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

思路:
DFS + DP
当两个字母相等的时候,可以选择dp[m][n] = dp[m + 1][n - 1]。
也可以选择dp[m][n] = min(dp[m + 1][n],dp[m][n -1]) + 1;
选择这两种中比较小的一个。
而如果两个字母不相等的时候只有一种选择。
dp[m][n] =min(dp[m + 1][n],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][n] != INF) return dp[m][n];    if(s[m] == s[n])         dp[m][n] = min(dfs(m + 1,n - 1),min(dfs(m, n - 1),dfs(m + 1,n)) + 1);    else        dp[m][n] = min(dfs(m, n - 1),dfs(m + 1, n)) + 1;    return dp[m][n];}void print(int m,int n) {    if(m > n)        return ;    if(m == n) {        printf("%c",s[m]);        return ;    }    if(s[m] == s[n]) {        printf("%c",s[m]);        print(m + 1, n - 1);        printf("%c",s[n]);    }    else if(dp[m][n] == dp[m + 1][n] + 1) {        printf("%c",s[m]);        print(m + 1,n);        printf("%c",s[m]);    }    else {        printf("%c",s[n]);        print(m,n - 1);        printf("%c",s[n]);    }}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;}
0 0
原创粉丝点击