打字游戏: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 打字游戏 题解 [ 绿 ] [ 最小生成树 ] [ 动态规划 ] [ 编辑距离 ]的更多相关文章

  1. 【BZOJ1413】[ZJOI2009]取石子游戏(博弈论,动态规划)

    [BZOJ1413][ZJOI2009]取石子游戏(博弈论,动态规划) 题面 BZOJ 洛谷 题解 神仙题.jpg.\(ZJOI\)是真的神仙. 发现\(SG\)函数等东西完全找不到规律,无奈只能翻题 ...

  2. 用JS写了一个打字游戏,反正我是通不了关

    今天想写个简单的游戏, 打字游戏好像都没写过, 那么就写打字游戏吧, gamePad包含了关卡的信息, 可以用来调整给个关卡字符下落的速度: getRandom函数会返回一个字符对象, 这个对象包含了 ...

  3. java打字游戏

    小记:老早之前写的程序,今天发现之前在 csdn上写的东西的图片不显示了,搞得人好郁闷,所以把之前零星的几篇文章搬个家 游戏运行截图: 字母实体类 package com.git.game; impo ...

  4. Java之线程———GUI线程(包含打字游戏和计时器俩个GUI实列)

    当java程序包含图形用户界面(GUI)时,Java虚拟机在运行应用程序时会自动启动更多的线程,其中有两个重要的线程:AWT-EventQuecue 和 AWT-Windows. AWT-EventQ ...

  5. jQuery 写的简单打字游戏

    var off_x; //横坐标 var count=0; //总分 var speed=5000; //速度,默认是5秒. var keyErro=0; //输入错误次数 var keyRight= ...

  6. linux系统指法练习与打字游戏软件

    以 fedora和ubuntu 系统为例,fedora/centos系统用yum install命令安装 ubuntu系统用apt-get instll命令安装 yum install ktouch$ ...

  7. JavaScript实现简单的打字游戏

    完整项目下载:https://download.csdn.net/download/weixin_44893902/13131694 演示地址:https://url_777.gitee.io/typ ...

  8. 【贪心】洛谷 P1199 三国游戏 题解

     这个题尽管题目长,主要还是证明贪心的正确性(与博弈关系不大) 题目描述 小涵很喜欢电脑游戏,这些天他正在玩一个叫做<三国>的游戏. 在游戏中,小涵和计算机各执一方,组建各自的军队进行对战 ...

  9. [题解+总结]NOIP动态规划大合集

    1.前言 NOIP2003-2014动态规划题目大合集,有简单的也有难的(对于我这种动态规划盲当然存在难的),今天就把这些东西归纳一下,做一个比较全面的总结,方便对动态规划有一个更深的理解. 2.NO ...

  10. [UOJ317]【NOI2017】游戏 题解

    题意 ​ 小 L 计划进行 \(n\) 场游戏,每场游戏使用一张地图,小 L 会选择一辆车在该地图上完成游戏. ​ 小 L 的赛车有三辆,分别用大写字母 A.B.C 表示.地图一共有四种,分别用小写字 ...

随机推荐

  1. Laravel环境搭建之HomeStead

    开发laravel,官方推荐使用HomeStead虚拟环境进行搭建. Linux: 1. 安装virtualbox(https://www.virtualbox.org/) 1)可以找到可供下载的镜像 ...

  2. Codeforces Round 797 (Div

    Codeforces Round 797 (Div. 3) Price Maximization 给定\(n\)个商品(n为偶数),每个商品的重量为\(a_i\),你需要将其两两打包,打包的成本为\( ...

  3. 【实战问题】-- 布隆过滤器的三种实践:手写,Redission以及Guava(2)

    前面我们已经讲过布隆过滤器的原理[实战问题]-- 缓存穿透之布隆过滤器(1),都理解是这么运行的,那么一般我们使用布隆过滤器,是怎么去使用呢?如果自己去实现,又是怎么实现呢? 目录 布隆过滤器 手写布 ...

  4. 将ipynb文件转成pdf

    本文内容:将GitHub上ipynb源码格式的书籍转成pdf 应用场景:GitHub上某些书籍按章节使用ipynb格式存储 (Jupyter创建了一种良好的交互方式,即将程序说明和代码放在同一个文档中 ...

  5. 表里不一--限制容器内存4G,free还是32G

    前言 最近有个新同事问了我一个问题,明明通过limit给容器内存限制了4G,为什么进容器看到的还是宿主机的内存32G docker run -it --rm -m 512m ubuntu:18.04 ...

  6. Content-Type 的小知识

    起因 在某次开发中,前端发起了get请求,但是后端报错未设置Content-Type为"application-json":看到这条报错之后就直接在请求中设置了: export c ...

  7. 【Kotlin】协程

    1 前言 ​ 相较于 C# 中的协程(详见 → [Unity3D]协同程序),Kotlin 中协程更灵活,难度更大. ​ 协程是一种并发设计模式,用于简化异步编程,它允许以顺序化的方式表达异步操作,避 ...

  8. sed 删除 替换 文件内容

      sed添加一行内容 使用sed命令添加一行内容有多种实现方法,下面是几种不同的实现方法: 方法一:使用sed命令在指定行前添加一行内容     sed '2i This is a new line ...

  9. Qt/C++音视频开发66-音频变速不变调/重采样/提高音量/变速变调/倍速播放/sonic库使用

    一.前言 之前在做倍速这个功能的时候,发现快速播放会有滴滴滴的破音出现,正常1倍速没有这个问题,尽管这个破音间隔很短,要放大音量才能听到,但是总归是不完美的,后面发现,通过修改qaudiooutput ...

  10. C Primer Plus 第6版 第八章 编程练习参考答案

    编译环境VS Code+WSL GCC 源码请到文末下载 . 我给第一题写了Linux shell脚本,感兴趣的同学可以尝试修改并运行一下. /*第1题************************ ...