bzoj1090 [SCOI2003]字符串折叠——区间DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1090
区间DP...
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,ans,dp[][];
char c[];
bool pd(int l1,int r1,int l2,int r2)
{
int k1=r1-l1+,k2=r2-l2+;
if(k1%k2)return ;//前一个区间较长
for(int i=;i<k1;i++)
if(c[l1+i]!=c[l2+i%k2])return ;
return ;
}
int cal(int x)
{
int ret=;
while(x)ret++,x/=;
return ret;
}
int main()
{
cin>>c;
n=strlen(c);
for(int i=;i<n;i++)
for(int j=;j<n;j++)
dp[i][j]=j-i+;
for(int len=;len<=n;len++)
for(int l=;l+len<n;l++)
{
int r=l+len;
for(int k=l;k<r;k++)
{
dp[l][r]=min(dp[l][r],dp[l][k]+dp[k+][r]);
if(pd(k+,r,l,k))dp[l][r]=min(dp[l][r],dp[l][k]++cal((r-k)/(k-l+)+));//纯折叠 //以l~k为一个循环节,注意不要除反了
}
}
printf("%d",dp[][n-]);
return ;
}
还有递归版:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char s[];
int f[][];
bool mark[][];
bool pd(int l1,int r1,int l2,int r2)
{
int k1=r1-l1+,k2=r2-l2+;
if(k1%k2)return ;//前一个区间较长
for(int i=;i<k1;i++)
if(s[l1+i]!=s[l2+i%k2])return ;
return ;
}
int cal(int x)
{
int ret=;
while(x)ret++,x/=;
return ret;
}
int dp(int l,int r)
{
if(l==r)return ;
if(mark[l][r])return f[l][r];
mark[l][r]=;
int t=r-l+;
for(int i=l;i<r;i++)
{
t=min(t,dp(l,i)+dp(i+,r));
if(pd(l,i,i+,r))t=min(t,dp(l,i)++cal((i-l+)/(r-i)+));
}
return f[l][r]=t;
}
int main()
{
cin>>s;
printf("%d",dp(,strlen(s)-));
return ;
}
递归
bzoj1090 [SCOI2003]字符串折叠——区间DP的更多相关文章
- 【BZOJ-1090】字符串折叠 区间DP + Hash
1090: [SCOI2003]字符串折叠 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1127 Solved: 737[Submit][Stat ...
- BZOJ 1090: [SCOI2003]字符串折叠 区间DP
1090: [SCOI2003]字符串折叠 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...
- [SCOI2003]字符串折叠 (区间DP)
题目描述 折叠的定义如下: 一个字符串可以看成它自身的折叠.记作S = S X(S)是X(X>1)个S连接在一起的串的折叠.记作X(S) = SSSS…S(X个S). 如果A = A’, B = ...
- B1090 [SCOI2003]字符串折叠 区间dp
又一道区间dp,和上一篇类似,但是比他简单,这个只有两种转移方法,不是很复杂.直接判断是否为重复的串就行. 题干: Description 折叠的定义如下: . 一个字符串可以看成它自身的折叠.记作S ...
- 洛谷P4302 [SCOI2003]字符串折叠(区间dp)
题意 题目链接 Sol 裸的区间dp. 转移的时候枚举一下断点.然后判断一下区间内的字符串是否循环即可 `cpp #include<bits/stdc++.h> #define Pair ...
- BZOJ1090 [SCOI2003]字符串折叠 区间动态规划 字符串
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1090 题意概括 折叠的定义如下: 1. 一个字符串可以看成它自身的折叠.记作S 2. X(S)是X ...
- BZOJ1090: [SCOI2003]字符串折叠
区间dp. 一种是分段dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]); 一种是这一段可以缩写dp[i][j]=min(dp[i][j],dp[i][l]+2+ca ...
- [bzoj1090][SCOI2003]字符串折叠_区间dp
字符串折叠 bzoj-1090 SCOI-2003 题目大意:我说不明白...链接 注释:自己看 想法:动态规划 状态:dp[i][j]表示从第i个字符到第j个字符折叠后的最短长度. 转移:dp[l] ...
- 【洛谷 P4302】 [SCOI2003]字符串折叠(DP)
题目链接 简单区间dp 令\(f[i][j]\)表示\([i,j]\)的最短长度 先枚举区间,然后在区间中枚举长度\(k\),看这个区间能不能折叠成几个长度为\(k\)的,如果能就更新答案. #inc ...
随机推荐
- bzoj 2721[Violet 5]樱花 数论
[Violet 5]樱花 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 671 Solved: 395[Submit][Status][Discuss ...
- nginx 安装过程中的not found
linux 发行版本:centos zlib not found openssl not found yum install zlib-devel yum install openssl-devel
- Ultra-QuickSort--POJ2299(归并排序求逆序数对)
http://poj.org/problem?id=2299 归并排序:比如现在有一个序列[l,r),我们可以把这个序列分成两个序列[l,mid),[mid,r),利用递归按照上 述方法逐步缩小序列, ...
- Mysql 数据库允许远程连接 服务器连接错误 Host 'XXX' is not allowed to connect to this MySQL server
如果连接数据库的时候出现这个问题 Host 'XXX' is not allowed to connect to this MySQL server 说明 Mysql数据库 不允许远程连接, 需要修改 ...
- ios开发 MPMoviePlayerController 视频播放器
项目中用到视频播放功能, 写点视频基础部分 MPMoviePlayerController是通过MediaPlayer.frame引入的,可用于播放在iOS支持的所有格式的视频,用起来很简单!!! M ...
- BZOJ 1055 HAOI2008 玩具取名 动态规划
题目大意:给定一个由'W','I','N','G'构成的字符串.给定一些规则.这些规则能够将两个字符合成为一个,比如"II"能够合成为'W',"WW"能够合成为 ...
- iOS国际化:NSLocalizedString的使用
因为iOS和XCode版本号更新得太快的原因,导致网上非常多文章都失去了时效性,或许再过两三个月我这篇文章也将走上这条路,但起码能够让现阶段看到的人对iOS的国际化有个比較清楚的认识. NSLocal ...
- Error Code: 2006 - MySQL 鏈嶅姟鍣ㄥ凡绂荤嚎
将sql文件导入到mysql时候,就一直报这个错误. 我试过网上各种方法都行不通. 最后将以下一句运行了一下就能够了,并且没有重新启动mysql. SET GLOBAL max_allowed_pac ...
- Dubbo应用启动与停止脚本,超具体解析
本周刚好研究了一下dubbo的启动脚本,所以在官网的启动脚本和公司内部的启动脚本做了一个整理,弄了一份比較通过的Dubbo应用启动和停止脚本. 以下的脚本仅仅应用于配置分离的应用.什 ...
- freemarker 模板
1 整体结构 模板(FTL 编程)是由例如以下部分混合而成的: Text 文本:文本会照着原样来输出. Interpolation 插值:这部分的输出会被计算的值来替换.插值由${和}所分隔(或者#{ ...