Hetao P2071 打字游戏 题解 [ 绿 ] [ 最小生成树 ] [ 动态规划 ] [ 编辑距离 ]
打字游戏:MST 套 dp 好题。
首先看这个数据范围,\(O(n^4)\) 把每两个字符串之前的编辑距离求一下很显然吧。
然后我们观察一下每一个 node 的性质,发现他要么自己打完,要么从别人那里复制过来。这个就很像一棵树。
建完树之后,我们就得到了一个森林。
那么题目就转化为,求出一个边权之和最小的森林,使得所有点都在森林中。
显然我们可以将森林中的每一个根节点超一个虚拟源点连一条边,这个边的边权是多少?实际上就是空串到他的编辑距离,也就是这个字符串的长度。
那么我们就可以在上面跑 MST 了。
还有一个性质,就是 \(A\) 从 \(B\) 那里复制过来和 \(B\) 从 \(A\) 那里复制过来的代价是一样的,正是因为这个性质,这个东西才是颗树,因为这样才是双向边。不然我们就得跑一个有向图 MST 了。有向图 MST 参考滑雪那题。
时间复杂度 \(O(n^4)\),瓶颈在于求编辑距离。
代码:
#include <bits/stdc++.h>
#define fi first
#define se second
#define lc (p<<1)
#define rc ((p<<1)|1)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pi;
ll n,k,dp[105][105],ans=0,cnt=0;
int f[105];
string s[105];
struct edge{
int u,v;
ll w;
}e[100005];
bool cmp(edge x,edge y)
{
return x.w<y.w;
}
ll cal(string a,string b)
{
for(int i=0;i<=a.length();i++)for(int j=0;j<=b.length();j++)dp[i][j]=0x3f3f3f3f;
for(int i=0;i<=a.length();i++)dp[i][0]=i;
for(int j=0;j<=b.length();j++)dp[0][j]=j;
for(int i=1;i<=a.length();i++)
{
for(int j=1;j<=b.length();j++)
{
if(a[i-1]==b[j-1])dp[i][j]=min(dp[i][j],dp[i-1][j-1]);
dp[i][j]=min(dp[i][j],min(dp[i-1][j]+1,dp[i][j-1]+1));
}
}
return dp[a.length()][b.length()];
}
void init()
{
for(int i=0;i<=n;i++)f[i]=i;
}
int findf(int x)
{
if(f[x]!=x)f[x]=findf(f[x]);
return f[x];
}
void combine(int x,int y)
{
int fx=findf(x),fy=findf(y);
f[fx]=fy;
}
int main()
{
freopen("game.in","r",stdin);
freopen("game.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>k;
s[0]="";
for(int i=1;i<=n;i++)
{
int x;
cin>>x>>s[i];
}
for(int i=0;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
e[++cnt]={i,j,cal(s[i],s[j])+k*((i!=0)&&(j!=0))};
}
}
sort(e+1,e+cnt+1,cmp);
init();
for(int i=1;i<=cnt;i++)
{
int u=e[i].u,v=e[i].v;
ll w=e[i].w;
int fu=findf(u),fv=findf(v);
if(fu!=fv)
{
combine(fu,fv);
ans+=w;
}
}
cout<<ans;
return 0;
}
Hetao P2071 打字游戏 题解 [ 绿 ] [ 最小生成树 ] [ 动态规划 ] [ 编辑距离 ]的更多相关文章
- 【BZOJ1413】[ZJOI2009]取石子游戏(博弈论,动态规划)
[BZOJ1413][ZJOI2009]取石子游戏(博弈论,动态规划) 题面 BZOJ 洛谷 题解 神仙题.jpg.\(ZJOI\)是真的神仙. 发现\(SG\)函数等东西完全找不到规律,无奈只能翻题 ...
- 用JS写了一个打字游戏,反正我是通不了关
今天想写个简单的游戏, 打字游戏好像都没写过, 那么就写打字游戏吧, gamePad包含了关卡的信息, 可以用来调整给个关卡字符下落的速度: getRandom函数会返回一个字符对象, 这个对象包含了 ...
- java打字游戏
小记:老早之前写的程序,今天发现之前在 csdn上写的东西的图片不显示了,搞得人好郁闷,所以把之前零星的几篇文章搬个家 游戏运行截图: 字母实体类 package com.git.game; impo ...
- Java之线程———GUI线程(包含打字游戏和计时器俩个GUI实列)
当java程序包含图形用户界面(GUI)时,Java虚拟机在运行应用程序时会自动启动更多的线程,其中有两个重要的线程:AWT-EventQuecue 和 AWT-Windows. AWT-EventQ ...
- jQuery 写的简单打字游戏
var off_x; //横坐标 var count=0; //总分 var speed=5000; //速度,默认是5秒. var keyErro=0; //输入错误次数 var keyRight= ...
- linux系统指法练习与打字游戏软件
以 fedora和ubuntu 系统为例,fedora/centos系统用yum install命令安装 ubuntu系统用apt-get instll命令安装 yum install ktouch$ ...
- JavaScript实现简单的打字游戏
完整项目下载:https://download.csdn.net/download/weixin_44893902/13131694 演示地址:https://url_777.gitee.io/typ ...
- 【贪心】洛谷 P1199 三国游戏 题解
这个题尽管题目长,主要还是证明贪心的正确性(与博弈关系不大) 题目描述 小涵很喜欢电脑游戏,这些天他正在玩一个叫做<三国>的游戏. 在游戏中,小涵和计算机各执一方,组建各自的军队进行对战 ...
- [题解+总结]NOIP动态规划大合集
1.前言 NOIP2003-2014动态规划题目大合集,有简单的也有难的(对于我这种动态规划盲当然存在难的),今天就把这些东西归纳一下,做一个比较全面的总结,方便对动态规划有一个更深的理解. 2.NO ...
- [UOJ317]【NOI2017】游戏 题解
题意 小 L 计划进行 \(n\) 场游戏,每场游戏使用一张地图,小 L 会选择一辆车在该地图上完成游戏. 小 L 的赛车有三辆,分别用大写字母 A.B.C 表示.地图一共有四种,分别用小写字 ...
随机推荐
- 利用 word VBA 将投标文件偏离参数表列数据拷贝至技术偏差表中
使用 vba 将正偏离参数表的第一列信息复制粘贴至对应的技术偏离表的第4列中.需要同时打开两个 word 文件,在技术偏差表中打开 VBE(可以用ctrl + f11 快捷键),插入模块. 忽略格式的 ...
- 第四届河南省 CCPC 大学生程序设计竞赛
F-集合之和 规定集合A和集合B的加法运算:\(A+B={x+y|x∈A,y∈B}\),设有限数集A中的元素个数为|A|,现给定n,请你构造集合A使得\(|A+A|=n\),如果A不存在,输出-1 题 ...
- Skyvern – AI浏览器自动化测试工具
Skyvern – AI浏览器自动化测试工具 Skyvern是什么 Skyvern是开源的浏览器自动化工具,结合大型语言模型(LLMs)和计算机视觉技术实现复杂的网页交互和数据提取.与传统的 ...
- [WPF UI] 为 AvalonDock 制作一套 Fluent UI 主题
AvalonDock 是我这些天在为自己项目做技术选型时发现的一个很好的开源项目,它是一个用于 WPF 的布局控件库,可以帮助我们实现类似 Visual Studio 的布局效果.因为它自带的一些样式 ...
- 零售经营“新赛道” ——基于手机银行APP专区调研的客群精细化运营分析报告
随着银行业竞争的不断深入及新客户增量日渐"到顶",各家银行的客群竞争逐渐由"跑马圈地"进入"精耕细作"的新阶段,在客群精准化服务方面不断 ...
- Spark内存调优
一.概述Spark 作为一个基于内存的分布式计算引擎,其内存管理模块在整个系统中扮演着非常重要的角色.理解 Spark 内存管理的基本原理,有助于更好地开发 Spark 应用程序和进行性能调优.本文旨 ...
- okhttp3设置代理(http/https)
最近项目网络请求需要设置代理,记录一下.http和https都可以. OkHttpClient.Builder builder = new OkHttpClient.Builder(); //代理服务 ...
- 痞子衡嵌入式:MCUXpresso for VS Code开发环境搭建及SDK工程导入
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso for VS Code开发环境搭建及SDK工程导入. MCUXpresso IDE(包括其前身 LPCXpress ...
- 如何使用vs将现有的项目或者文件夹(尤其是多层目录的)添加到项目中
在Visual Studio中将现有的项目或者文件夹(尤其是多层目录的)添加到项目解决方案中,步骤如下: 1.将现有项目或文件夹拷贝到指定目录下: 2.解决方案右上有个显示所有文件的按钮,如下图所示: ...
- 痛苦调优10小时,我把 Spark 脚本运行时间从15小时缩短到12分钟!
周一我就有个困惑,还写成文章了:如何从 Spark 的 DataFrame 中取出具体某一行,里面提了自己猜想的几种解决方案. 没想到这么快就要面对这个问题了,我用小孩子都听得懂的例子描述一下我在干什 ...