UVA 10739 String to Palindrome (增删字符将非回文串串变身回文串,动态规划dp )


H - String to Palindrome
Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu



Description



题目大意:

给你一个字符串,让你给他变成回文字符串。

你可以对这个字符串进行三种方式的更改。

●  删除字符

●  更改字符

●  替换字符

并且没一种方式都可以无限次的使用,让你求出最少需要多少次更改,才能变成回文串


分析思路:

DP[x][y]表示比较到下标是x和下标是y时的最小的步数,最终结果为DP[0][len - 1]

if(str[x]==str[y])

dp[x][y]=DP(x+1,y+1);

if(str[x]!=str[y])

做删除操作,状态1+min(DP(x+1,y),DP(x,y-1))

做添加操作,状态1+DP(x+1,y-1)

做替换操作,状态1+DP(x+1,y-1)

综上分析以后  核心代码就出来了

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


这道题如果你将 dp 定义成 long long 类型,那么输出的时候需要用 %lld 输出  ,不能用 %I64d 输出,就因为这,错了三次,233  ,提示是格式错误。对于这个错误是 一脸懵逼 :-( 



附上代码:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <string>
#include <algorithm>
#include <vector>
#include <cmath>
#define LL long long
#define MAX_N 50000
using namespace std;

int dp[1100][1100];

int main()
{
	int t;
	cin >> t;
	int sum = 1;
	while(t--)
	{
		string str;
		cin >> str;
		memset(dp,0,sizeof(dp));
		for(int i = str.size() - 1;i >= 0;i--)
		{
			for(int j = i + 1;j < str.size();j++)
			{
				if(str[i] == str[j])
				{
					dp[i][j] = dp[i + 1][j - 1];
				}
				else
				{
					dp[i][j] = min(dp[i + 1][j - 1],min(dp[i + 1][j],dp[i][j - 1])) + 1;
				}
			}
		}
		printf("Case %d: %d\n", sum++, dp[0][str.size() - 1]);
	}
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章