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