bzoj 1068: [SCOI2007]压缩
2015-09-01 22:57
309 查看
做之前可以先做一下这题 http://www.lydsy.com/JudgeOnline/problem.php?id=1090
本来是想做一道区间DP的
然而太弱 并没有很快理解如何用传统区间DP(区间合并)来写这题
于是先用自己yy的比较水的方法做了一遍(其实也就是模拟题意中的压缩操作)
用$f[i][j]$表示 现在原串处理好了第$i$位 且缓冲串长度为$j$时的最小花费
那么$f[i][j]$可以从这三种情况转移过来
$f[i-1][j-1]+1$(填原字母)
$f[i-j/2][j/2]+1$(填R,j为偶数)
$f[i][k]+1$(填M,j=0)
于是这样就可以先水过(注意$j$的一个比较粗略的上界是$2i$)
先把这个坑挖着 以后会了再来用传统区间DP方法来填坑
本来是想做一道区间DP的
然而太弱 并没有很快理解如何用传统区间DP(区间合并)来写这题
于是先用自己yy的比较水的方法做了一遍(其实也就是模拟题意中的压缩操作)
用$f[i][j]$表示 现在原串处理好了第$i$位 且缓冲串长度为$j$时的最小花费
那么$f[i][j]$可以从这三种情况转移过来
$f[i-1][j-1]+1$(填原字母)
$f[i-j/2][j/2]+1$(填R,j为偶数)
$f[i][k]+1$(填M,j=0)
于是这样就可以先水过(注意$j$的一个比较粗略的上界是$2i$)
#include <bits/stdc++.h> using namespace std; char s[60]; int f[60][110]; int n,ans; bool check(int L,int R) { int len=R-L+1; for(int i=L;i<=R;++i) if(s[i]!=s[i-len]) return 0; return 1; } int main() { memset(f,0x3f,sizeof(f)); scanf("%s",&s[1]); n=strlen(&s[1]); f[0][0]=0; for(int i=1;i<=n;++i) { for(int j=max((i-1)*2,1);j;--j) { f[i][j]=f[i-1][j-1]+1; if((j&1)==0&&check(i-j/2+1,i)) f[i][j]=min(f[i][j],f[i-j/2][j/2]+1); f[i][0]=min(f[i][0],f[i][j]+1); } } ans=f [0]; for(int i=n*2;i;--i) ans=min(ans,f [i]); printf("%d\n",ans); return 0; }
先把这个坑挖着 以后会了再来用传统区间DP方法来填坑
相关文章推荐
- scala实现迭代器模式
- MySQL(六)之查询
- Vim配置 显示行号 语法高亮 智能缩进 更适合程序员使用
- #import与@class的区别
- DB2修改表深度分析
- iOS开发之UI基础--Button基础
- Qt网络编程—TCP/IP(一)
- 点击目标和设备工具包
- scala实现备忘录模式
- JVM自动内存管理
- jQuery的append方法的一些问题
- 计算机科学与技术反思录
- 通过登入IP记录Linux所有用户登录所操作的日志
- Codeforces 573 A. Bear and Poker
- lsof
- ubuntu 镜像源更新
- 源代码管理工具(下)-SVN目录结构
- 如何使用SDK在Ubuntu设备(包括仿真器和桌面)上运用应用程序
- 【Java】代处理?代理模式 - 静态代理,动态代理
- maven私服搭建