您的位置:首页 > 其它

动态规划(DP) 求回文划分

2018-03-29 20:26 197 查看
#include<iostream>
#include <string>
#include <vector>
using namespace std;

void CalcSubPalindrome(const string &str,int size,vector<vector<bool>>&p)
{
for (int i=0;i<size;i++)
{
p[i][i]=true;
}
for (int i=size-2;i>=0;i--)
{
p[i][i+1]=(str[i]==str[i+1]);
for (int j=i+2;j<size;j++)
{
if ((str[i]==str[j])&&p[i+1][j-1]==true)
{
p[i][j]=true;
}
}
}
}/*DP 在(i+1,j-1)为回文串的前提下 str[i]==str[j] ->(i,j)为回文串 */

//DFS
void MinPalindrome(const string str,int size,int nStart,const vector<vector<bool>>&p,
vector<vector<string>>&all,vector<string>&solution)
{
if (nStart>=size)
{
all.push_back(solution);
}
for (int i=nStart;i<size;i++)
{
if (p[nStart][i]) //[nstart i]构成了回文子串
{
solution.push_back(str.substr(nStart,i+1-nStart));
MinPalindrome(str,size,i+1,p,all,solution);
solution.pop_back();
}
}
}

void ADD(vector<vector<string>>&to,vector<vector<string>>&from,const string &sub)
{
if (from.empty())
{
to.push_back(vector<string>(1,sub));   //
}
//to=from;
for (vector<vector<string>>::const_iterator it=from.begin();it!=from.end();it++)
{
//to.push_back(vector<string>());
//vector<string>&now=to.back();   //引用
vector<string>now;
for(vector<string>::const_iterator s=it->begin();s!=it->end();s++)
{
now.push_back(*s);
}
now.push_back(sub);
to.push_back(now);
}
//for (int i = 0; i < from.size(); i++)
//{
//	for (int j=0;j<from[i].size();j++)
//	{
//		to[i].push_back(from[i][j]);
//	}
//	to[i].push_back(sub);
//}
}

//DP
void MinPalindrome2(const string str,int size,const vector<vector<bool>>&p,
vector<vector<string>>&all)
{
vector<vector<string>>*prefix=new vector<vector<string>>[size];
//prefix[0].push_back(vector<string>(str[0]));
prefix[0].clear();
for (int i=1;i<=size;i++)
{
for (int j=0;j<i;j++)
{
if (p[j][i-1])
{
ADD((i==size)?all:prefix[i],prefix[j],str.substr(j,i-j));
}
}
}

}

void Print_Bool(const vector<vector<bool>>p,int size)
{
for (int i=0;i<size;i++)
{
for (int j=0;j<size;j++)
{
if(p[i][j])
cout<<"1"<<" ";
else
cout<<"0"<<" ";
}
cout<<endl;
}
}

void Print_solution(vector<string>solution)
{
for (int i=0;i<solution.size();i++)
{
cout<<solution[i]<<"|";
}
}

void Print_all(const vector<vector<string>>all)
{
for (int i=0;i<all.size();i++)
{
Print_solution(all[i]);
cout<<endl;
}
}

int main()
{
string str="abacdccdaa";
int len=str.length();
vector<vector<bool>>p;
p.resize(len);
for (int i=0;i<len;i++)
{
p[i].resize(len);
}
CalcSubPalindrome(str,len,p);
//Print_Bool(p,len);
vector<vector<string>>all;//所有结果
MinPalindrome2(str,len,p,all);

//vector<string> solution;//
//MinPalindrome(str,len,0,p,all,solution);
cout<<"Count:"<<all.size()<<endl;
Print_all(all);
//Print_Bool(p,len);
return 0;
}

Count:16
aba|c|dccd
4000
|aa|
a|b|a|c|dccd|aa|
aba|c|d|cc|d|aa|
a|b|a|c|d|cc|d|aa|
aba|cdc|c|d|aa|
a|b|a|cdc|c|d|aa|
aba|c|d|c|c|d|aa|
a|b|a|c|d|c|c|d|aa|
aba|c|dccd|a|a|
a|b|a|c|dccd|a|a|
aba|c|d|cc|d|a|a|
a|b|a|c|d|cc|d|a|a|
aba|cdc|c|d|a|a|
a|b|a|cdc|c|d|a|a|
aba|c|d|c|c|d|a|a|
a|b|a|c|d|c|c|d|a|a|
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: