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


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