動態規劃題:把一個字串變為迴文串

小飛_Xiaofei發表於2013-12-06

版權所有。所有權利保留。

歡迎轉載,轉載時請註明出處:

http://blog.csdn.net/xiaofei_it/article/details/17172891

把一個字串變成迴文串,最少要新增幾個字元?

動態規劃解:

f(i,j)表示s[i..j]變為迴文串需要新增的最少字元數。

f(i,j)=0 if i>=j

f(i,j)=f(i+1,j-1) if i<j and s[i]==s[j]

f(i,j)=min(f(i,j-1),f(i+1,j))+1 if i<j and s[i]!=s[j]

程式碼如下:

#include <iostream>
#include <string.h>
using namespace std;
#define min(a,b) ((a)<(b)?(a):(b))
int f[100][100];
int main()
{
	string s;
	while (cin>>s)
	{
		memset(f,0,sizeof(f));
		for (int i=s.length()-1;i>=0;i--)
			for (int j=i+1;j<s.length();j++)
				if (s[i]==s[j])
					f[i][j]=f[i+1][j-1];
				else
					f[i][j]=min(f[i][j-1],f[i+1][j])+1;
		cout<<f[0][s.length()-1]<<endl;
	}
	return 0;
}


相關文章