CSU 1620: A Cure for the Common Code(KMP+区间DP)

2024-05-12 20:32
文章标签 dp code 区间 common kmp cure csu 1620

本文主要是介绍CSU 1620: A Cure for the Common Code(KMP+区间DP),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Description

Input

Output

Sample Input

abcbcbcbca
abbbcdcdcdabbbcdcdcd
0

Sample Output

Case 1: 7
Case 2: 11

HINT

题意:给一个小写子母的串,相邻相同的子串可以合在一起,问这个串合并后最短可得多长。
解题:KMP & 区间DP
#include<stdio.h>
#include<string.h>
const int N = 505;int next1[N];
char s[N];void getNext(int l,int len){int i=0, j=-1;next1[0]=-1;while(i<len){if(j==-1||s[l+i]==s[l+j]){i++; j++;next1[i]=j;}elsej=next1[j];}
}int main(){int c=0,dp[N][N];while(scanf("%s",s)>0&&s[0]!='0'){int len=strlen(s);for(int i=0;i<len;i++)dp[i][i]=1;for(int k=1;k<len;k++)for(int i=0;i+k<len;i++){int j=i+k;dp[i][j]=1+dp[i+1][j];for(int e=i;e<j;e++)if(dp[i][j]>dp[i][e]+dp[e+1][j])dp[i][j]=dp[i][e]+dp[e+1][j];//------整个子串计算一次-------getNext(i,k+1);int t=k+1-next1[k+1];//得循环节长度if((k+1)%t==0){int ans=dp[i][i+t-1];//循环部分的字符串最优解if(t>1)ans+=2;  //循环部分的字符串长度>1,则加一对括号t=(k+1)/t;      //有多少个循环部分while(t)ans++,t/=10; //位数if(dp[i][j]>ans)dp[i][j]=ans;}}printf("Case %d: %d\n",++c,dp[0][len-1]);}
}


这篇关于CSU 1620: A Cure for the Common Code(KMP+区间DP)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/983660

相关文章

前端Visual Studio Code安装配置教程之下载、汉化、常用组件及基本操作

《前端VisualStudioCode安装配置教程之下载、汉化、常用组件及基本操作》VisualStudioCode是微软推出的一个强大的代码编辑器,功能强大,操作简单便捷,还有着良好的用户界面,... 目录一、Visual Studio Code下载二、汉化三、常用组件1、Auto Rename Tag2

Java中的随机数生成案例从范围字符串到动态区间应用

《Java中的随机数生成案例从范围字符串到动态区间应用》本文介绍了在Java中生成随机数的多种方法,并通过两个案例解析如何根据业务需求生成特定范围的随机数,本文通过两个实际案例详细介绍如何在java中... 目录Java中的随机数生成:从范围字符串到动态区间应用引言目录1. Java中的随机数生成基础基本随

VS Code中的Python代码格式化插件示例讲解

《VSCode中的Python代码格式化插件示例讲解》在Java开发过程中,代码的规范性和可读性至关重要,一个团队中如果每个开发者的代码风格各异,会给代码的维护、审查和协作带来极大的困难,这篇文章主... 目录前言如何安装与配置使用建议与技巧如何选择总结前言在 VS Code 中,有几款非常出色的 pyt

解决Nginx启动报错Job for nginx.service failed because the control process exited with error code问题

《解决Nginx启动报错Jobfornginx.servicefailedbecausethecontrolprocessexitedwitherrorcode问题》Nginx启... 目录一、报错如下二、解决原因三、解决方式总结一、报错如下Job for nginx.service failed bec

MySQL CTE (Common Table Expressions)示例全解析

《MySQLCTE(CommonTableExpressions)示例全解析》MySQL8.0引入CTE,支持递归查询,可创建临时命名结果集,提升复杂查询的可读性与维护性,适用于层次结构数据处... 目录基本语法CTE 主要特点非递归 CTE简单 CTE 示例多 CTE 示例递归 CTE基本递归 CTE 结

csu(背包的变形题)

题目链接 这是一道背包的变形题目。好题呀 题意:给n个怪物,m个人,每个人的魔法消耗和魔法伤害不同,求打死所有怪物所需的魔法 #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>//#include<u>#include<map

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

hdu4826(三维DP)

这是一个百度之星的资格赛第四题 题目链接:http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1004&cid=500 题意:从左上角的点到右上角的点,每个点只能走一遍,走的方向有三个:向上,向下,向右,求最大值。 咋一看像搜索题,先暴搜,TLE,然后剪枝,还是TLE.然后我就改方法,用DP来做,这题和普通dp相比,多个个向上

hdu1011(背包树形DP)

没有完全理解这题, m个人,攻打一个map,map的入口是1,在攻打某个结点之前要先攻打其他一个结点 dp[i][j]表示m个人攻打以第i个结点为根节点的子树得到的最优解 状态转移dp[i][ j ] = max(dp[i][j], dp[i][k]+dp[t][j-k]),其中t是i结点的子节点 代码如下: #include<iostream>#include<algorithm

hdu4865(概率DP)

题意:已知前一天和今天的天气概率,某天的天气概率和叶子的潮湿程度的概率,n天叶子的湿度,求n天最有可能的天气情况。 思路:概率DP,dp[i][j]表示第i天天气为j的概率,状态转移如下:dp[i][j] = max(dp[i][j, dp[i-1][k]*table2[k][j]*table1[j][col] )  代码如下: #include <stdio.h>#include