[UVa-437] Color Length

计算贡献;压缩空间优化时间

传送门:$>here<$

题意

给出两个字符串$a$,$b$,将他们穿插起来(相对位置不变),要求最小化$\sum L(c)$,其中$L(c)$的定义时在穿插完的字符串中字符$c$的最大位置与最小位置的差。

数据范围:$n \leq 5000$

Solution

问题的转化

根据$LCS$的模型容易想到$dp_{i,j}$表示$a$的前$i$个与$b$的前$j$个穿插后的最小$L$。转移即接$i$或接$b$.

如何转移呢?如果要利用这样的状态进行转移,肯定需要知道每种字符出现的最早位置。这样的话状态就变得很大了……

既然用直接的方法无法进行转移,那么必须改变计算方法!将dp(i,j)的意义改为将a的前i个与b的前j个合并后对最终答案的最优贡献。也就是说,不要将dp(i,j)作为子问题去考虑,而是考虑这一部分对整体的贡献。

将题目要求的某种字符的最大位置与最小位置的差看做一条线段,这条线段从这个字符首次出现开始延伸,直到最后一个这种字符出现。那么题目要求最小化的就是26根线段的总长度。那么dp(i,j)就是表示填完a的前i个与b的前j个以后线段的最小总长。

利用DP来解决

要计算最小总长(假设现在选择将a[i]放在最后),那么就考虑将a[i]填入后总长增加多少?很显然,对于那些还没有出现完的字符,它们对应的线段长度就要+1。什么意思?对于a[i]前面的每字符,若还有可能在a[i]后方出现,那么对应的线段长度需要延伸。如果某种字符在a[i]之后再也不会出现了,那就不用延伸了。因此,填完a[i]后延伸的总长度就是还没有出现完的字符个数。

值得注意的是,这里的dp(i,j)既然不是子问题,那是如何保证DP的性质的呢?结合深搜来理解一下,假设最终字符的最后几位怎么填已经知道,那么前面怎么填最优?由于之前出现了哪些字符是确定的,因此最后几位在填的时候延伸的总长度是确定的,那么也就是最小化前面的总长度,那么也就是dp(i,j)了。

透过题解看本质

问题的转化

当发现当前问题极难转移时,不妨换一种计算思路。既然子问题无法考虑,那就整体考虑。

形象生动

把位置之差理解为线段很直观便于思考。避免去空想那些太抽象的东西 。

部分解并不独立有意义

不仅仅是因为这道题部分考虑比较难所以选择整体考虑,而是因为这道题的很多部分解对于转移是没有意义的。

my code

值得注意的是如果用二维DP会炸。幸好可以直接滚动数组变成1维。

还发现优化空间能够帮助优化时间。

/*By DennyQi 2019*/
#include <cstdio>
#include <queue>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int MAXN = 10010;
const int MAXM = 20010;
const int INF = 0x3f3f3f3f;
inline int Max(const int a, const int b){ return (a > b) ? a : b; }
inline int Min(const int a, const int b){ return (a < b) ? a : b; }
inline int read(){int x = 0; int w = 1; register char c = getchar();for(; c ^ '-' && (c < '0' || c > '9'); c = getchar());if(c == '-') w = -1, c = getchar();for(; c >= '0' && c <= '9'; c = getchar()) x = (x<<3) + (x<<1) + c - '0'; return x * w;
}
int T,dp[5010],cnt[5010],lsta[30],lstb[30],fsta[30],fstb[30],la,lb;
char a[5010],b[5010];
inline void Init_cnt(){memset(lsta,0,sizeof(lsta));memset(lstb,0,sizeof(lstb));memset(fsta,0x3f,sizeof(fsta));memset(fstb,0x3f,sizeof(fstb));for(int i = 1; i <= la; ++i){lsta[a[i]-'A'] = max(lsta[a[i]-'A'],i);fsta[a[i]-'A'] = min(fsta[a[i]-'A'],i);}for(int i = 1; i <= lb; ++i){lstb[b[i]-'A'] = max(lstb[b[i]-'A'],i);fstb[b[i]-'A'] = min(fstb[b[i]-'A'],i);}
}
inline void DP(){memset(dp,INF,sizeof(dp));memset(cnt,0,sizeof(cnt));char cur;dp[0] = 0;for(int i = 0; i <= la; ++i){for(int j = 0; j <= lb; ++j){if(i==0 && j==0) continue;if(i == 0){    cnt[j] = cnt[j-1];cur = b[j]-'A';if(j == fstb[cur]) ++cnt[j];if(j == lstb[cur] && lsta[cur] == 0) --cnt[j];}else{cur = a[i]-'A';if(j >= lstb[cur] && i >= lsta[cur]) --cnt[j];if(j < fstb[cur] && i == fsta[cur]) ++cnt[j];}dp[j] = min((j==0)?INF:dp[j-1], (i==0)?INF:dp[j])+cnt[j];}}
}
int main(){scanf("%d",&T);while(T--){scanf("%s%s",a+1,b+1);la = strlen(a+1), lb = strlen(b+1);Init_cnt();DP();printf("%d\n",dp[lb]);}return 0;
}

转载于:https://www.cnblogs.com/qixingzhi/p/10390174.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/484177.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue前后端对接时判断是否与后端连接成功

版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。 本文链接&#xff1a;https://blog.csdn.net/Happyaileaf/article/details/101985533 Vue前后端对接时判断是否与后端连接成功使用 axios API连接…

人工智能vs人类智能小传

来源&#xff1a;混沌巡洋舰Alphago代表的深度网络人工智能体现了AI逐步进入未知领域的强大能力&#xff0c; 因此有人堪忧有人喜乐&#xff0c; 却极少有人戳中要害。说AI比人牛是因为它下围棋比人厉害&#xff1f; 说AI离真正的智能很遥远是因为它不能创造吗&#xff1f; 是…

IDEA换行CRLF, LF, CR的解释和默认设置

在window下开发有一个大坑&#xff0c;就是换行默认是CRLF&#xff0c;也就是回车换行&#xff0c;但是Linux下只有换行LF&#xff0c;这样代码提交后&#xff0c;会出现编译问题&#xff0c;所以最好的办法是在IDEA下设置默认为LF。 首先我们先介绍CRLF&#xff0c;LF和CR这三…

云数据库

一.概述 1.1 云计算通过网络以服务的方式为用户提供廉价的资源。 1.2 优势 按需服务&#xff1b;随时服务&#xff1b;通用性&#xff1b;高可靠性&#xff1a;冗余备份&#xff1b;成本低&#xff0c;廉价&#xff1b;超大规模&#xff1b;虚拟化&#xff1b;扩展性高&#…

线程的构造和运行

① 用Thread类构造线程对象&#xff08;继承Thread类来创建并启动多线程&#xff09; package cn.sxt.thread;/*** 创建线程方式一&#xff1a;* 1、创建&#xff1a;继承Thread重写run* 2、启动&#xff1a;创建子类对象start* author 1979**/public class StartThread ext…

一个困扰数学家30多年的分类问题,终于被解决了!

来源&#xff1a;AI科技评论作者&#xff1a;Steve Nadis编译&#xff1a;陈彩娴编辑&#xff1a;青暮一般情况下&#xff0c;当你要对某个特定地区的植物进行调查时&#xff0c;你可能会按植物的种类来划分。就这种方法来看&#xff0c;如果是沿着托斯卡纳海岸的某些地带做这类…

NuGet version

https://stackoverflow.com/questions/15964935/get-nuget-exe-version-from-command-line Typing nuget help from the command line will in addition to the expected help information also list the current NuGet.exe version. 从官网下载&#xff0c;然后直接放在C:\Win…

线程的互斥与同步机制

同个人博客&#xff1a;http://tsundere-x.top/ 一、互斥 为何需要引入互斥机制&#xff1f; 当多个线程对同一数据并发读写&#xff08;至少有一个线程执行写操作&#xff09;时&#xff0c;这种情形被称为竞争。竞争会导致数据读或写的不确定性。而有时这种不确定性是不可…

欢迎参加“城市大脑与应急管理”专家研讨会

来源&#xff1a;城市大脑全球标准研究组数字大脑学术系列沙龙第二期“城市大脑与应急管理”专家研讨会2021以来城市大脑的建设与研究获得了长足发展&#xff0c;数百个城市开展了城市大脑的建设与规划&#xff0c;取得了诸多成果。于此同时&#xff0c;伴随着疫情、水灾、交通…

MapReduce词频统计

1.1 文件准备 创建本地目录和创建两个文本文件&#xff0c;在两个文件中输入单词&#xff0c;用于统计词频。 cd /usr/local/hadoop mkdir WordFile cd WordFile touch wordfile1.txt touch wordfile2.txt1.2 创建一个HDFS目录&#xff0c;在本地上不可见,并将本地文本文件上传…

炼数成金 Oracle EBS R12 DBA培训视频教程

----------------------课程目录------------------------------├01_第一课EBSDBA概要├02_第二课 EBSDBA 安装├02_第二课 R12 Linux x86 64bit installation├03_第三周 EBSDBA 架构├04_第四周EBSDBA-基本管理├05_第五周EBSDBA-OAM├06_第六周EBSDBA-sysadmin├07_第7周E…

Spring中注解大全

Spring中注解大全 Controller 标识一个该类是Spring MVC controller 处理器&#xff0c;用来创建处理http请求的对象 Controller public class TestController{RequestMapping("test")public String test(Map<String,Object> map){return "hello"…

Linux系统组成

1 系统组成 BootLoader&#xff1a;操作系统引导程序 内核&#xff1a; 文件系统&#xff1a;应用程序(用户开发的、网上下载的) 2 安装USB驱动 dongryd-linux:~$ insmod usb_dnw.ko //安装USB驱动 dongryd-linux:~$ kernel:GuoQian USB driver for DMW! //出现这一句说明驱动…

使用github托管代码以及github一些最常用的命令

生成SSH密钥 首先打开命令行工具&#xff0c;右键鼠标任意位置打开git bash here,然后输入以下命令 cd ~/.ssh 使用ssh-keygen生成密钥 ssh-keygen -t rsa -C "我的邮箱地址" 使用默认的文件名&#xff0c;输入密码&#xff0c;密钥生成成功 直接复制命令行看到的密钥…

Hive安装与配置MySQL元数据库

一.MySQL的安装 1.1 更新获取最新软件源&#xff0c;并安装MySQL。 sudo apt-get update sudo apt-get install mysql-server1.2 启动和关闭MySQL服务器。 service mysql start service mysql stop1.3 确认MySQL 是否启动成功&#xff0c;MySQL 处于LISTEN状态则表示启动成功…

国际领先的人工智能团队值得我们学习和深思

‍来源&#xff1a;陈德旺科学网博客链接地址&#xff1a;http://blog.sciencenet.cn/blog-57940-1299162.html如其说&#xff0c;人工智能&#xff08;AI&#xff09;现今热潮是Hinton等图灵奖获得者引发的&#xff0c;不如说是DeepMind&#xff08;深度思考&#xff0c;简称深…

C - 思考使用差分简化区间操作

FJs N (1 ≤ N ≤ 10,000) cows conveniently indexed 1..N are standing in a line. Each cow has a positive integer height (which is a bit of secret). You are told only the height H (1 ≤ H ≤ 1,000,000) of the tallest cow along with the index I of that cow. F…

Curr Biol:间隔学习可巩固记忆的奥秘

来源&#xff1a;brainnews已有一些实验现象表明当把连续的学习过程在一定时间范围内做间隔&#xff08;spaced&#xff09;后&#xff0c;学习效率将大大提高&#xff0c;这种效应称为“间隔效应”。然而迄今为止尚未有进一步的研究来探索间隔学习是如何影响与记忆相关的神经环…

Flume原理及使用案例

本文为转载篇&#xff01;原文&#xff1a; https://www.cnblogs.com/zhangyinhua/p/7803486.html https://www.cnblogs.com/ciade/p/5495218.html 原理 一、Flume简介 flume 作为 cloudera 开发的实时日志收集系统&#xff0c;受到了业界的认可与广泛应用。Flume 初始的发行版…

Hadoop相关技术

一.Hadoop 的优化与发展 1.1 局限与不足 抽象层次低&#xff0c;需要人工编码&#xff1b;表达能力有限&#xff1b;开发者自己管理作业之间的依赖关系&#xff1b;难于看到程序的整体的逻辑&#xff1b;执行迭代操作效率低;实时性差&#xff1b;资源浪费&#xff1b; 1.2 改…