`

UVA String to Palindrome(10739)

 
阅读更多

题目大意:

        给定一个字符串,使用替换字符,增加字符和删除字符三种操作使得字符串变成回文,求出最少的操作次数。

 

解题思路:

        动态规划题目,题中的增加字符和删除字符的操作本质上是一样的,可以都理解为增加字符。

        设dp[i][j] 表示字符串第 i 个字符到第 j 个字符是回文所需操作的次数,则假设第 i+1 到 j-1 的字符是回文了,那么第 i 个字符和第 j 个字符就有两种情况,一种是相等,则 dp[i][j] = dp[i+1][j-1], 即不用操作;另外一种是不相等,那么就得增加一次操作,操作的方式有三种: dp[i+1][j],dp[i][j-1] 和 dp[i+1][j-1], 第一种表示在第 i 个字符那里增加一个和 j 相同的字符, 第二种表示在 j-1 那里增加一个和 i 相同的字符, 第三种就是删除该字符,状态回到 dp[i+1][j-1],所以状态转移方程就是 :

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

从三种操作中选取最小的一个,然后加 1。

 

代码如下:

#include <iostream>
#include <cstring>
using namespace std;

int dp[1010][1010];
char s[1010];

int main()
{
	int T, len;

	cin>>T;

	for( int k = 1; k <= T; k++ )
	{
		cin>>s;
		len = strlen(s);
		memset( dp, 0, sizeof( dp ) );

		for( int i = len-1; i >= 0; i-- )
		{
			for( int j = i+1; j < len; j++ )
			{
				if( s[i] == s[j] )
					dp[i][j] = dp[i+1][j-1];
				else
				{
					dp[i][j] = min( dp[i+1][j], min(dp[i][j-1], dp[i+1][j-1] ) ) + 1;
				}
			}
		}

		cout<<"Case "<<k<<": "<<dp[0][len-1]<<endl;
	}

	return 0;
}

 

分享到:
评论

相关推荐

    c语言-1312-minimum-insertion-steps-to-make-a-string-palindrome

    c语言入门 c语言_1312_minimum_insertion_steps_to_make_a_string_palindrome

    POJ1159-Palindrome

    1. **字符串处理**:在C++中,处理字符串通常使用`std::string`类,可以进行字符串的创建、拼接、查找、比较等操作。在本题中,我们需要读取输入的字符串并进行分析。 2. **回文判断**:回文判断有多种方法。一种...

    Number-of-shifts-left-to-right-and-vice-versa-to-make-a-string-palindrome.-java-easy-:给定字符串输入,程序将打印回文所需的班次数

    转变为字符串回文的次数--java-easy- 给定字符串输入,程序将打印回文所需的班次数。 移位是在字符串的一端删除或插入一个字符,然后将其插入到字符串的另一端。 输入格式: 第一行-输入的字符串数为n。...

    palindrome

    《回文:数据结构的魅力与应用》 回文,这个看似简单的词汇,实则蕴含了丰富的数学和计算机科学内涵。在中文中,回文是指正读反读都能保持相同的词语,如“上海自来水来自海上”。而在计算机领域,尤其是数据结构中...

    Pku acm 第1159题 Palindrome 代码

    Pku acm 第1159题 Palindrome 代码,有详细的注释,动态规划

    Palindrome Sub-Array

    Given a 2-D array of N rows and M columns, your task is to find a maximum sub-array of P rows and P columns, of which each row and each column is a palindrome sequence. Input  The first line of ...

    JAVA程序 Palindrome(回文?)

    JAVA程序 Palindrome.java 输入任何字母数字组合 检查是否是回文结构? 例:abccba 从左往右看 和 从右往左看一样 为回文结构 包括检查是否带标点符号 检查是否有空格 如a bccba 输入带空格 仍为回文结构

    C++实现的Palindrome,回文

    std::string preprocess(const std::string &str) { std::string result; for (char c : str) { if (std::isalnum(c)) { result += std::tolower(c); } } return result; } bool isPalindrome(std::string ...

    LeetCode9 Palindrome Number

    《LeetCode9:判断回文数——Java实现详解》 在编程的世界里,LeetCode是一个广受欢迎的在线平台,它提供了各种算法问题供程序员们挑战和提升技能。今天我们要探讨的是LeetCode第9题——“回文数”。...

    UVA100~200---52道题accept代码,均顺利accept过

    3. **UVA131 - Palindrome**:这是一个关于回文串的问题,要求检查一个字符串是否是回文。可以使用双指针法或翻转字符串的方法来解决。 4. **UVA152 - The Stock Maximal Sequence**:此题属于动态规划,要求找到...

    PalindromeNumber.java

    PalindromeNumber.java

    Palindrome.java

    回文数Java

    palindrome22.in

    palindrome22.in

    北大POJ1159-Palindrome

    北大POJ1159-Palindrome

    palindrome_prime.c

    palindrome_prime.c

    palindrome:Ruby回文检测器。 通过遵循了解足够的Ruby来进行构建

    回文探测器通过遵循迈克尔·哈特尔... String类的方法,可以如下使用: $ irb&gt;&gt; require 'bencreating_palindrome'&gt;&gt; "honey badger".palindrome?=&gt; false&gt;&gt; "deified".palindrome?=&gt; true&gt;&gt; "Able was I, ere I

    java-palindrome-example:一个示例Java服务

    GET /java-palindrome-example/palindrome/&lt;string&gt; 解析提供的字符串,并找到其中包含的最大回文。 在此情况下,也可以将type的可选查询参数设置为slow在这种情况下,服务将使用慢得多的递归算法。 例子 GET /java...

    huiwenshu.rar_palindrome

    标题中的“huiwenshu.rar_palindrome”表明这是一个关于回文数的程序或代码库,可能用于教学或练习目的。回文数是指正向读和反向读都一样的数字,比如121、12321等。在银行管理场景中,回文数可能与账户编号、交易...

    Palindrome.py

    Palindrome.py

    PyPI 官网下载 | check-palindrome-kriti-0.0.1.tar.gz

    《PyPI官网下载:探索check-palindrome-kriti-0.0.1.tar.gz中的Python库知识》 PyPI(Python Package Index)是Python开发者的重要资源库,它提供了丰富的Python库供全球开发者下载和使用。本文将深入探讨标题为...

Global site tag (gtag.js) - Google Analytics