【UVA】10739 - String to Palindrome(动态规划)

本文介绍了一种使用动态规划方法来计算将任意字符串转化为回文串所需的最少操作次数。通过递归函数实现状态转移,考虑了删除和添加字符等操作,并提供了完整的C++代码实现。

比较水的动态规划

dp[i][j] 将原串 i ~ j 之内的字符转化为回文字符所需要的最小操作次数

其中删除操作和添加操作本质上是一样的。

三个状态转移方程:

dp[i][j] = min(dp[i][j] ,dp[i + 1][j]);

dp[i][j] = min(dp[i][j] ,dp[i + 1][j - 1]);

dp[i][j] = min(dp[i][j] ,dp[i][j - 1]);

如果 i = j  dp[i][j] = 0;

14145138 10651 Pebble Solitaire Accepted C++ 0.009 2014-09-04 09:09:42

#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<map>
#include<iostream>
using namespace std;
#define MAXD 1000 + 10
#define INF 10000
char str[MAXD];
int dp[MAXD][MAXD];
int dfs(int start,int last){
    if(dp[start][last] != -1)
        return dp[start][last];
    if(start == last)
        return dp[start][last] = 0;
    if(str[start] == str[last]){
        if(start + 1 == last)
            return dp[start][last] = 0;
        else
            return dp[start][last] = dfs(start + 1 , last - 1);
    }
    dp[start][last] = INF;
    if(last - 1 >= start)
    dp[start][last] = min(dp[start][last],dfs(start,last - 1) + 1);
    if(start + 1 <= last)
    dp[start][last] = min(dp[start][last],dfs(start + 1, last) + 1);
    if(start + 1 <= last - 1)
    dp[start][last] = min(dp[start][last],dfs(start + 1,last - 1) + 1);
    return dp[start][last];
}
int main(){
    int T;
    scanf("%d",&T);
    for(int Case = 1; Case <= T; Case ++){
        scanf("%s",str);
        memset(dp,-1,sizeof(dp));
        int ans = dfs(0,strlen(str) - 1);
        printf("Case %d: %d\n",Case,ans);
    }
    return 0;
}

这是输出样例:2A3MEAS -- is a mirrored string.但如果我用我的代码#include <stdio.h> #include <string.h> int is_palindrome(char str[55]){ int len=strlen(str); for(int i=0;str[i]!='\0';i++){ if(str[i]!=str[len-i-1]) return 0; } return 1; } int is_mirrord_palindrome(char str[55]){ char s[55]={0}; int t=0; for(int i=0;str[i]!='\0';i++){ t++; if(str[i]=='B'||str[i]=='C'||str[i]=='D'||str[i]=='F'||str[i]=='G'||str[i]=='K'||str[i]=='N'||str[i]=='P'||str[i]=='Q'||str[i]=='R'||str[i]=='4'||str[i]=='6'||str[i]=='7'||str[i]=='9'){ return 0; } else { switch (str[i]){ case 'A':s[i]='A'; break; case 'E':s[i]='3'; break; case 'H':s[i]='H'; break; case 'I':s[i]='I'; break; case 'J':s[i]='L'; break; case 'L':s[i]='J'; break; case 'M':s[i]='M'; break; case 'O':s[i]='O'; break; case 'S':s[i]='2'; break; case 'T':s[i]='T'; break; case 'U':s[i]='U'; break; case 'V':s[i]='V'; break; case 'W':s[i]='W'; break; case 'X':s[i]='X'; break; case 'Y':s[i]='Y'; break; case 'Z':s[i]='5'; break; case '1':s[i]='1'; break; case '2':s[i]='S'; break; case '3':s[i]='E'; break; case '5':s[i]='Z'; break; case '8':s[i]='8'; break; } } } s[t+1]='\0'; if(!strcmp(str,s)) return 1; else return 0; } int main() { char str[55]; while(scanf("%s",str)!=EOF){ printf("%s",str); printf(" -- "); if(is_palindrome(str)&&is_mirrord_palindrome(str)) printf("is a mirrored palindrome.\n\n"); else if(is_palindrome(str)&&!is_mirrord_palindrome(str)) printf("is a regular palindrome.\n\n"); else if(!is_palindrome(str)&&is_mirrord_palindrome(str)) printf("is a mirrored string.\n\n"); else printf("is not a palindrome.\n\n"); } return 0; }输出是2A3MEAS -- is not a palindrome.为什么
最新发布
12-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值