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就跑完了,我都不敢相信自己的眼睛了,看来以后实在想不到解法可以考虑一下暴力。。
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; }
相关文章推荐
- cocos2dx-屏幕设置
- scala 中配置文件之 config
- Check the difficulty of problems - poj 2151 (概率+DP)
- 算法导论--矩阵链相乘
- 从服务器读取一张图片
- 牛客网(搜狗2015 C++工程师笔试题)
- ThreadHandle And CloseHandel
- Java基础-IO-其它流(笔记)
- [贪心]poj3045 Cow Acrobats
- 如何调试Javascript代码
- Linux 前后台程序
- 南邮 OJ 2069 赵信的往事
- 1426POJ
- 求最长回文字符串
- android 底部固定菜单栏的实现(一)
- 输入是一个只包含拼音的字符串,请输出对应的数字序列。
- 算法导论--钢条切割
- cocos2dx-粒子特效
- 南邮 OJ 2068 爱魔法的露露
- 使用JavaMail连接带有TLS的SMTP