打字游戏: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. 理解Flink之三Transformation

    Transformation 是 Flink操作的底层实现,无论是map还是Flatmap. DataStream类中包含两个变量: StreamExecutionEnvironment Transf ...

  2. go 编译超时解决

    转载请注明出处: 在编译go项目时,遇到依赖下载超时,异常输出如下: CGO_ENABLED=0 GOOS=linux GO111MODULE=on go build -a -ldflags '-ex ...

  3. 交易系统:电商、O2O、线下门店购物流程详解

    大家好,我是汤师爷~ 新零售业务涉及多个销售渠道,每个渠道都有其独特的业务特点,需要相应的营销方式.运营策略和供应链管理. 主要销售渠道包括:实体门店(包括直营连锁店.加盟门店).电商平台销售(如淘宝 ...

  4. vue ssr error: TypeError: Cannot read property 'replace' of undefined

    在开发vue ssr应用时, yarn build  yarn start 之后启动正常: info Server running at: http://0.0.0.0:6606 在访问页面时,发现页 ...

  5. 【kernel】从 /proc/sys/net/ipv4/ip_forward 参数看如何玩转 procfs 内核参数

    本文的开篇,我们先从 sysctl 这个命令开始. sysctl 使用 sysctl 是一个 Linux 系统工具,后台实际上是 syscall,它允许用户查看和动态修改内核参数. # 查看当前设置的 ...

  6. PowerShell一键下载Nuget某个包的所有版本

    一转眼好几年没有写博客了,来博客园冒个泡,最近由于工作需要,内网办公,幸运的是只需要上传一个*.nupkg一个包信息就可以在私有nuget下载到了,下面就用PowerShell编写下载脚本,需要注意的 ...

  7. Fuzz技术综述与文件Fuzz

    文章一开始发表在微信公众号 https://mp.weixin.qq.com/s?__biz=MzUyNzc4Mzk3MQ==&mid=2247486189&idx=1&sn= ...

  8. 利用Catalina快速重新指定tomcat的代码路径

    思路: 在/tomcat/conf/Catalina/localhost目录下,建立对应的xml文件,来定义. 方法: 比如:想在 Http://localhost/test-api 显示,且代码放在 ...

  9. 04C++顺序结构(3)

    一.设置域宽setw() 教学视频1 输出的内容所占的总宽度成为域宽,有些高级语言中称为场宽.使用setw()前,必须包含头文件iomanip,即#include.头文件iomanip,用来声明一些& ...

  10. 【Python】【爬虫】【爬狼】003_获取搜索结果的页数

    # 获取搜索内容的页数 需要的包 import urllib.request # 获取网页源码 import re # 正则表达式,进行文字匹配 from bs4 import BeautifulSo ...