BZOJ1090 字符串折叠 UVA1630 Folding 【dp】

news/2025/2/1 17:04:40/

题目链接:
https://www.lydsy.com/JudgeOnline/problem.php?id=1090
https://uva.onlinejudge.org/external/16/p1630.pdf

题意:
有一个字符串,问折叠的最小长度,BZOJ1090只需输出长度,UVA1630需要输出折叠后的字符串

题解:
显然动态规划,考虑BZOJ1090的简化版本:
d p [ i ] [ j ] dp[i][j] dp[i][j]表示将 [ i . . . j ] [i...j] [i...j]折叠的最小长度,那么转移分两种情况:
d p [ i ] [ j ] = d p [ i ] [ k ] + d p [ k + 1 ] [ j ] dp[i][j]=dp[i][k]+dp[k+1][j] dp[i][j]=dp[i][k]+dp[k+1][j] 直接拼上去不管折叠
d p [ i ] [ j ] = g e t d i g i t ( t i m e s ) + 2 + d p [ i ] [ k ] dp[i][j]=getdigit(times)+2+dp[i][k] dp[i][j]=getdigit(times)+2+dp[i][k] t i m e s times times [ k + 1... j ] [k+1...j] [k+1...j] [ i . . . k ] [i...k] [i...k]重复几次得到的,如果不重复则为 inf ⁡ \inf inf,2是括号, d p [ i ] [ k ] dp[i][k] dp[i][k]是括号里面的数)
重复得到的数瞎判一下就好了
注意这里 k k k是从 i i i开始循环而不是 i + 1 i+1 i+1,反例就是循环节为1的字符串(这都能80分23333),答案就是 d p [ 1 ] [ n ] dp[1][n] dp[1][n]

UVA的版本就是再开一个数组记录一下字符串就可以了。
调的时候有点心态崩,各位将就着看吧2333

BZOJ1090:

// by Balloons
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define mpr make_pair
#define debug() puts("okkkkkkkk")
#define rep(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)using namespace std;typedef long long LL;const int inf = 1 << 30;
const int maxn=105;char s[maxn];
int n;
int dp[maxn][maxn];int getnum(int x){int cnt=0;while(x){x/=10;++cnt;}return cnt;
}int gett(int x,int p,int y){int fx=p-x+1,fy=y-p;if(fy%fx!=0)return inf;int loop=fy/fx;for(int i=0;i<loop;i++)for(int j=0;j<fx;j++){int to=p+i*fx+j+1;if(s[x+j]!=s[to])return inf; }return loop+1;
}int main(){
//	freopen("BZOJ1090.out","w",stdout);scanf("%s",s+1);n=strlen(s+1);for(int i=1;i<=n;i++)for(int j=i;j<=n;j++)dp[i][j]=j-i+1;for(int l=2;l<=n;l++){for(int i=1;i+l-1<=n;i++){int j=i+l-1;for(int k=i;k<j;k++){int times=gett(i,k,j);dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]);if(times==inf)continue;dp[i][j]=min(dp[i][j],getnum(times)+2+dp[i][k]);}}	}printf("%d\n",dp[1][n]);return 0;
}

UVA1630:

// by Balloons
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <string>
#define mpr make_pair
#define debug() puts("okkkkkkkk")
#define rep(i,a,b) for(int (i)=(a);(i)<=(b);(i)++)using namespace std;typedef long long LL;const int inf = 1 << 30;
const int maxn=105;char s[maxn];
int n;
int dp[maxn][maxn];
string dd[maxn][maxn];int getnum(int x){int cnt=0;while(x){x/=10;++cnt;}return cnt;
}int gett(int x,int p,int y){int fx=p-x+1,fy=y-p;if(fy%fx!=0)return inf;int loop=fy/fx;for(int i=0;i<loop;i++)for(int j=0;j<fx;j++){int to=p+i*fx+j+1;if(s[x+j]!=s[to])return inf; }return loop+1;
}string tos(int tt){string ts="";while(tt){ts+=tt%10+'0';tt/=10;}reverse(ts.begin(),ts.end());return ts;
}int main(){
//	freopen("BZOJ1090.out","w",stdout);while(scanf("%s",s+1)!=EOF){memset(dp,0,sizeof dp);n=strlen(s+1);for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)dd[i][j].clear();for(int i=1;i<=n;i++){string tmpf="";for(int j=i;j<=n;j++){dp[i][j]=j-i+1;tmpf+=s[j];dd[i][j]=tmpf;}}for(int l=2;l<=n;l++){for(int i=1;i+l-1<=n;i++){int j=i+l-1;for(int k=i;k<j;k++){int times=gett(i,k,j);if(dp[i][j]>dp[i][k]+dp[k+1][j]){dp[i][j]=dp[i][k]+dp[k+1][j];dd[i][j]=dd[i][k]+dd[k+1][j];}if(times==inf)continue;int hh=getnum(times)+2+dp[i][k];if(dp[i][j]>hh){dp[i][j]=hh;dd[i][j]=tos(times)+"("+dd[i][k]+")";}}}	}cout<<dd[1][n]<<endl;}return 0;
}

http://www.ppmy.cn/news/223286.html

相关文章

orarcle11g中服务代表的意思

&#xff08;1&#xff09;OracleServiceSID 数据库服务&#xff0c;这个服务会自动地启动和停止数据库。如果安装了一个数据库&#xff0c;它的缺省启动类型为自动。服务进程为ORACLE.EXE&#xff0c;参数文件initSID.ora&#xff0c;日志文件SIDALRT.l…

COMP 1630 Relational Database Design and SQL

代做COMP 1630作业、代写SQL实验作业、代做Database Design作业、代写SQL语言程序作业COMP 1630Relational Database Design and SQL Term Project Using Microsoft SQL Server, write the SQL statements for each question necessary to generate the required result set. …

【题解】【AcWing】1630. 期终成绩

1630. 期终成绩 原题传送&#xff1a;AcWing 1630. 期终成绩 对于在中国大学MOOC学习“数据结构”课程的学生&#xff0c;想要获得一张合格证书&#xff0c;必须首先获得不少于 200 200 200 分的在线编程作业分&#xff0c;然后总评获得不少于 60 60 60 分&#xff08;满分…

pandas速学——常用函数

一、读取数据 pd.read_csv(filename) 读取 CSV 文件&#xff1b; pd.read_excel(filename) 读取 Excel 文件&#xff1b; pd.read_sql(query, connection_object) 从 SQL 数据库读取数据&#xff1b; pd.read_json(json_string) 从 JSON 字符串中读取数据&#xff1b; pd.read…

oracle11 css 启动,oracle 11g CSS 和OCR 的恢复

查看当前表决磁盘文件列表 [gridvmac1 ~]$ crsctl query css votedisk ## STATE File Universal Id File Name Disk group -- ----- ----------------- --------- --------- 1. ONLINE 458f802427764f59bfc6f6f356e74f5c (/dev/asm-di…

Oracle11g服务详细介绍

Oracle11g服务详细介绍及哪些服务是必须开启的&#xff1f; Oracle ORCL VSS Writer Service Oracle卷映射拷贝写入服务&#xff0c;VSS&#xff08;Volume Shadow Copy Service&#xff09;能够让存储基础设备&#xff08;比如磁盘&#xff0c;阵列等&#xff09;创建高保真的…

bzoj2023/1630

沉迷文化无法自拔&#xff08;划掉&#xff09; 分析&#xff1a;dp加上前缀和乱搞。 搞了个月榜rank2 &#xff0c;不知道rank1怎么刷的&#xff0c;是不是停课了。。 #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> …

redhat 7.9 安装oracle 11g-11.2.0.4

redhat 7.9 安装oracle 11g-11.2.0.4 0、本实验涉及的操作系统镜像文件、数据库安装包、SQL Developer安装包做如下分享0.1、操作系统镜像文件0.2、数据库安装包0.3、SQL Developer安装包 1、数据库安装文档1.1、查看oracle 11g 适合安装的linux版本1.2、安装文档1.3、license种…