BZOJ1068
来源:互联网 发布:欠淘宝消保金会 编辑:程序博客网 时间:2024/06/04 22:16
传送门:BZOJ1068
比较微妙的区间Dp。
令f(i,j)表示压缩[i,j]段时最少的字符数,我们发现无法转移,于是将[i,j]中有无M纳入状态:f(i,j,k),k属于[0,1],表示区间中有无M。
我们总是假定[i,j]前有一个M或是0。
然后方程就比较显然了。
k=1
f(i,j,k)=min{f(i,i’,1)+f(i’+1,j,1)+1} //表示分两段压缩
k=1或0
f(i,j,k)=min{f(i,i’,k)+j-i’} //表示只压缩前一段
[i,j]段如分成等长的两段完全相等
f(i,j,k)=f(i,(j+i)/2,0)+1 //表示是使用一个M-R压缩
注意这个转移要判断[i,j]段长度是否为偶数
有意思的一点是,按照这个定义f(i,i,1)应该是无穷大,但可以证明f(i,i,1)为1才能得出正确答案。
代码上的小细节见下(这题代码神丑)
#include <cstdio>#include <cstdlib>#include <cmath>#include <cstring>#include <algorithm>#include <iostream>using namespace std;const int INF=0x3f3f3f3f;int f[55][55][3];bool used[55][55][3];string st;bool Check(int a,int b){ int len=b-a+1; if(len%2==1) return false; for(int i=a;i<=(a+b)/2;i++) if(st[i]!=st[i+len/2]) return false; return true;}int Dp(int a,int b,int c)//f(i,j,k){ if(used[a][b][c]) //visited f(a,b,c) return f[a][b][c]; if(Check(a,b)) //can be squeezed f[a][b][c]=Dp(a,(a+b)/2,0)+1; if(c) for(int i=a;i<b;i++) f[a][b][c]=min(f[a][b][c],Dp(a,i,1)+Dp(i+1,b,1)+1); //another M is in i for(int i=a;i<b;i++) f[a][b][c]=min(f[a][b][c],Dp(a,i,c)+b-i); // R is in i //printf("%d %d %d %d\n",f[a][b][c],a,b,c); used[a][b][c]=true; return f[a][b][c];}void Readdata(){ freopen("loli.in","r",stdin); cin>>st;}void First(){ memset(f,0x3f,sizeof(f)); memset(used,false,sizeof(used)); for(int i=0;i<st.length();i++){ f[i][i][0]=f[i][i][1]=1; used[i][i][0]=used[i][i][1]=true; }}void Solve(){ printf("%d\n",min(Dp(0,st.length()-1,0),Dp(0,st.length()-1,1)));}void Close(){ fclose(stdin); fclose(stdout);}int main(){ Readdata(); First(); Solve(); Close(); return 0;}
0 0
- BZOJ1068
- bzoj1068压缩
- bzoj1068: [SCOI2007]压缩
- bzoj1068[SCOI2007]压缩
- 【bzoj1068】[SCOI2007]压缩
- 【bzoj1068】[SCOI2007]压缩
- 【BZOJ1068】[SCOI2007]压缩【区间DP】
- 【bzoj1068】[SCOI2007]压缩 区间dp
- [bzoj1068][SCOI2007]压缩 区间dp
- bzoj1068(区间dp,字符串压缩)
- [BZOJ1068][SCOI2007]压缩(区间DP)
- bzoj1068 [SCOI2007]压缩(区间DP)
- HDOJ_Problem Archive_1005_Number Sequence
- 轻松上Google
- Leetcode(62)(63) Unique Paths I II
- IT架构——降低成本和复杂性
- Android特效View之二之 闪闪发光Shimmer字体特效
- BZOJ1068
- The Combinatorica Project 组合数学
- leetcode之路006 ZigZag Conversion
- JS 解析XML文件
- Android实战简易教程-第二十八枪(基于Bmob实现头像图片设置和网络上传功能!)
- leetcode[116]:Populating Next Right Pointers in Each Node
- JAVA基础之理解JNI原理
- 2.2 内核VMX基本数据结构与操作
- hdu 4704 Sum||hdu 4869 Turn the pokers 费马小定理