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

比较水的动态规划

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;
}
时间: 2024-10-25 11:53:10

【UVA】10739 - String to Palindrome(动态规划)的相关文章

uva 10739 String to Palindrome (dp)

uva 10739 String to Palindrome In this problem you are asked to convert a string into a palindrome with minimum number of operations. The operations are described below: Here you'd have the ultimate freedom. You are allowed to: Add any character at a

区间DP UVA 10739 String to Palindrome

题目传送门 1 /* 2 题意:三种操作,插入,删除,替换,问最少操作数使得字符串变成回文串 3 区间DP:有一道类似的题,有点不同的是可以替换,那么两端点不同的时候可以替换掉一个后成回文, 4 即dp[j+1][k-1] + 1,还有这道题没有要求打印 5 */ 6 /************************************************ 7 * Author :Running_Time 8 * Created Time :2015-8-17 15:45:22 9 *

UVA 10739 String to Palindrome(DP)

In this problem you are asked to convert a string into a palindrome with minimum number of operations. The operations are described below: Here you'd have the ultimate freedom. You are allowed to: Add any character at any position Remove any characte

UVa 10739 - String to Palindrome

题目:给你一个字符串,可以进行增删改三种操作,问变成回文串最少的操作次数. 分析:动态规划,dp,LCS.可以利用区间dp求解,这里利用LCS求解更快. 利用字符串和自己的翻转求最大公共子序列,然后枚举所有的dp[i][len-i], 找最小的即可.注意可能最小值在dp[i-1][len-i],即str[i]为中间元素,不用匹配. 说明:注意dp的初始化赋值. #include <cstring> #include <cstdio> int dp[1001][1001]; int

UVa 164 - String Computer

题目:编辑距离,给你两个串,将已知串转化成目标串,可以增.删.改字母,求最小操作次数. 分析:dp,编辑距离.同最大公共子序列.注意操作位置是实时变化的.(前面都已经处理好了) f[i][j] = f[i-1][j]         这时删掉 str1[i],位置j+1: f[i][j] = f[i][j-1]         这时增加 str2[j],位置j: f[i][j] = f[i-1][j-1]+k  如果str1[i] == str2[j]这时相同k=0,否则k=1,位置j. 说明:

uva 10981 - String Morphing(记忆化+离散)

题目链接:uva 10981 - String Morphing 题目大意:给出一个规则,表示由两个字符可以变成一个字符(题目中的表),然后给出一个字符串A,问如何同过规则变换得到B串,输出过程. 解题思路:记忆化搜索,每次枚举当前串可以变换的位置,然后记录下来,用map映射设,有个剪枝就是找到B串就可以结束搜索了.然后在从B串回溯输出答案. #include <cstdio> #include <cstring> #include <iostream> #includ

区间DP UVA 1351 String Compression

题目传送门 1 /* 2 题意:给一个字符串,连续相同的段落可以合并,gogogo->3(go),问最小表示的长度 3 区间DP:dp[i][j]表示[i,j]的区间最小表示长度,那么dp[i][j] = min (dp[j][k] + dp[k+1][i+j-1]), 4 digit (i / k) + dp[j][j+k-1] + 2)后者表示可以压缩成k长度连续相同的字符串 4.5 详细解释 5 */ 6 /*****************************************

UVA 10981 - String Morphing(记忆化搜索)

题目链接:10981 - String Morphing 题意:给定开始的字符串,要求根据表格变化成一个字符串,问变化的顺序(注意,不一定要最少步数) 思路:记忆化搜索,用map来存字符串的状态,一开始按最少步数去做TLE,其实只要找到一个符合的就可以了 代码: #include <stdio.h> #include <iostream> #include <string.h> #include <string> #include <map> u

uva 1626 Brackets Sequence ?(动态规划)

状态表示方法:d[ i ][ j ]表示的是一条序列的开始和结束: 状态定义:d[ i ][ j ]表示字串s[ i~j ] 需要添加的数量. #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n; char s[105]; int d[105][105]; bool match(char ch1,char ch2) { if((ch1=='['&&am