您的位置:首页 > 其它

uva 11584 动态规划

2015-08-08 10:58 260 查看
给定一串字符串,看最少能把它分成几个回文字符串。

SampleInput

3

racecar

fastcar

aaadbccb

SampleOutput

1

7

3

dp[i]=min(dp[j]+1);(i~j为回文)。开始一看数据是1000,没敢写,去网上看了看都是这样做的,只好也跟着这样做,本以为是O(n^3)的复杂度,现在看来可能系数很小,但是感觉也是不太明白,系数再小也是n^3啊,尽然78ms就跑完了,我都不敢相信自己的眼睛了,看来以后实在想不到解法可以考虑一下暴力。。

#include<map>
#include<vector>
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<stack>
#include<queue>
#include<set>
#define inf 0x3f3f3f3f
#define mem(a,x) memset(a,x,sizeof(a))

using namespace std;

typedef long long ll;
typedef pair<int,int> pii;

inline int in()
{
int res=0;char c;
while((c=getchar())<'0' || c>'9');
while(c>='0' && c<='9')res=res*10+c-'0',c=getchar();
return res;
}
char a[1111];
int dp[1111];
bool check(int l,int r)
{
while(l<r)
{
if(a[l++]!=a[r--])return 0;
}
//cout<<"i=="<<r<<" ";
return 1;
}

int main()
{
int T=in();
while(T--)
{
gets(a);
int n=strlen(a);
for(int i=0;i<n;i++)
{
dp[i]=dp[i-1]+1;   //初始化为上一个加一
for(int j=0;j<=i;j++)
{
if(check(j,i))
{
if(j>0)dp[i]=min(dp[j-1]+1,dp[i]);
else dp[i]=1;
}

}
}
//for(int i=0;i<n;i++)
cout<<dp[n-1]<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: