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;
}