hdu 4295 4 substrings problem DP 字符串

题意:给定一个字符串,还有它的四个字串, 选择合适的位置让这些子串覆盖原串,问最多和最少的覆盖字符数。

做法:先用个法子求出每个字符位置是否可以放某个串,然后建立状态,dp[i][j],i是当前探索的位置,j是匹配点。值得注意的是,每个点可能可以匹配多个字串,这个可以用类似背包的手法解决,即在一个位置多次匹配计算修正,具体看代码,其实数组是可以降成一维的

#include <cstdio>
#include <cstring>
#define max(a,b) ((a)>(b) ? (a):(b))
#define min(a,b) ((a)<(b) ? (a):(b))
#define eps 1e5
const int sLEN=64;
const int LMT=5000;
const int lim=15;
const int sub=4;
int dpx[sLEN+10][lim+10],dpn[sLEN+10][lim+10];
int can[LMT][sub];
void init(void)
{
    int i,j,k;
    memset(can,0,sizeof(can));
        for(j=0;j<70;j++)
            for(k=0;k<70;k++)
            {
                dpx[j][k]=-eps;
                dpn[j][k]=eps;
            }
            dpx[0][0]=dpn[0][0]=0;
}
int main(void)
{
    char sec[LMT],ord[70];
    int i,pos,ii,jj,j,st,t,anx,ann;
    sec[0]=9;
    while(~scanf("%s",&sec[1]))
    {
        init();
        for(i=0;i<sub;++i)
        {
            scanf("%s",ord);
            for(pos=1;sec[pos];++pos)
            {
                    for(ii=pos,jj=0;sec[pos]&&ord[jj]&&sec[ii]==ord[jj];++ii,++jj);
                    if(!ord[jj])can[pos][i]=jj;
            }
        }
        anx=-eps;ann=eps;
        for(i=1;sec[i];++i)
        {
            for(j=0;j<=sLEN;++j)
                for(st=0;st<=lim;++st)//0代表匹配位置在当前位置的后边,当前位置增加1,匹配位置减少1,但0要另算
                {
                    if(j)
                    {
                        dpn[j][st]=dpn[j+1][st];
                        dpx[j][st]=dpx[j+1][st];
                    }
                    else
                    {
                        dpn[j][st]=min(dpn[j][st],dpn[j+1][st]);
                        dpx[j][st]=max(dpx[j][st],dpx[j+1][st]);
                    }
                }
          for(t=0;t<sub;++t)//当前位置匹配一下。
          if(can[i][t])
            for(jj=0;jj<=sLEN;++jj)
              for(st=0;st<=lim;++st)
              if(!(st&(1<<t)))
              {
                  j=max(jj,can[i][t]);
                  dpn[j][st|(1<<t)]=min(dpn[j][st|(1<<t)],dpn[jj][st]+max(0,j-jj));
                  dpx[j][st|(1<<t)]=max(dpx[j][st|(1<<t)],dpx[jj][st]+max(0,j-jj));
              }
                anx=max(anx,max(dpx[1][lim],dpx[0][lim]));
                ann=min(ann,min(dpn[1][lim],dpn[0][lim]));
        }
        printf("%d %d\n",ann,anx);
    }
    return 0;
}


基于STM32的循迹避障小车资料源码(高分项目),个人大四的毕业设计、经导师指导并认可通过的高分设计项目,评审分99分,代码完整确保可以运行,小白也可以亲自搞定,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(高分项目)基于STM32的循迹避障小车资料源码(
内容概要:本文详细介绍了SSM框架(Spring、SpringMVC、MyBatis)的相关知识,涵盖Maven项目管理工具、前端开发技术、HTTP协议及Tomcat服务器等内容。文章首先讲解了SSM框架的组成,包括Spring的IOC、DI、AOP等功能,SpringMVC的请求处理流程以及MyBatis的数据操作。接着介绍了Maven作为项目管理工具的作用,如依赖管理和项目构建,并详细描述了Maven的配置文件pom.xml的使用方法。此外,还探讨了HTTP协议的特点、请求响应格式,以及Web服务器Tomcat的基本概念和工作原理。最后,文章对前端开发技术进行了概述,包括HTML、CSS、JavaScript等基础知识,并简要介绍了Ajax技术。 适合人群:具备一定编程基础,特别是Java开发经验的研发人员,尤其是那些正在学习或使用SSM框架进行Web开发的工程师。 使用场景及目标:①理解SSM框架的工作原理及其各组成部分的功能;②掌握Maven的使用,包括项目创建、依赖管理、生命周期等;③熟悉HTTP协议的请求响应机制,能够处理常见的HTTP请求和响应;④掌握前端开发技术,如HTML、CSS、JavaScript等,能够进行简单的前端页面开发;⑤了解Tomcat服务器的工作原理及其配置方法。 阅读建议:本文内容丰富,涵盖了从后端到前端的多个方面,建议读者在学习过程中结合实际项目进行实践,尤其是在Maven项目管理和SSM框架的具体应用上,多动手操作,加深理解。同时,对于HTTP协议和前端开发技术,可以通过实际的网络请求和页面开发来巩固所学知识。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值