2022 Robocom CAIP国赛 第四题 变牛的最快方法

原题链接:

PTA | 程序设计类实验辅助教学平台

题面:

shu.png

niu.png

这里问的是把任意一种动物的图像变成牛的方法…… 比如把一只鼠的图像变换成牛的图像。方法如下:

  • 首先把屏幕上的像素点进行编号;
  • 然后把两只动物的外轮廓像素点编号按顺时针记录下来;
  • 用最少的变换次数将鼠的轮廓变成牛的 —— 这里仅允许对鼠的轮廓进行 3 钟操作:
  1. 插入一个像素编号
  2. 删除一个像素编号
  3. 更改一个像素编号

输入格式:

输入分别在两行中给出两种动物的轮廓像素点编号,编号为 (0,106] 区间内的整数,允许重复。轮廓以编号 −1 结尾,这个编号不算在轮廓内。题目保证每种动物的轮廓包含不超过 1000 个像素点。

输出格式:

在第一行中输出从第一只动物变换成第二只动物需要的最少变换次数。

在第二行中顺次描述对第一只动物轮廓的每个像素所作的操作:

  • 如果这个像素被删除,则在对应位置输出 0
  • 如果这个像素被改变,则在对应位置输出 1
  • 如果这个像素不变,则在对应位置输出 2
  • 如果这个像素前面或者后面插入了一个像素,则在插入的位置输出 3

答案可能不唯一,输出任何一种可能的解都可以。行首尾和数字间均无空格。

输入样例:

13 5 6 20 2 20 1 13 9 20 3 28 3 34 6 25 233 -1
3 5 6 20 6 20 3 5 9 3 9 20 3 6 6 25 233 -1

输出样例:

8
122212112023121222

样例解释:

1、13 更改为 3,随后 5、6、20 不变
2、2 更改为 6,下一个 20 不变
3、1 更改为 3
4、第二个 13 更改为 5,随后 9 不变
5、删除下一个 20,后面的 3 不变
6、在 28 的前面插入 9
7、28 更改为 20,后面的 3 不变
8、34 更改为 6,后面的 6、25、233 不变

解题思路:

设dp[i][j]为A的前i位转化为B的前j位所需要的最少步数。

当A[i] == B[j]时,dp[i][j] = dp[i - 1][j - 1];

当A[i] != B[j]时,有以下三种情况:

        dp[i - 1][j] + 1,删除,将A的最后一个字符删除

        dp[i][j - 1] + 1,插入,在B的最后插入A的最后一个字符

        dp[i - 1][j] + 1,替换,将B的最后一个字符替换为A的最后一个字符

取最小即可。

至于输出每一位的操作,我们在求dp表的过程中就可以顺便记录每一步的转换操作,开一个二维数组edit来保存每一步状态转移。然后我们可以用递归的方式还原操作路径。具体实现细节详见代码。

代码(CPP):

#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1e3 + 10;
const int INF = 0x3fffffff;
const int mod = 1000000007;
int a[maxn], b[maxn];
int dp[maxn][maxn];
int edit[maxn][maxn];
vector<int> path;
int n, m;void dfs(int i, int j) {if (i == 0 && j == 0) {return;}if (edit[i][j] == 0) {dfs(i - 1, j);} else if (edit[i][j] == 1) {dfs(i - 1, j - 1);} else if (edit[i][j] == 2) {dfs(i - 1, j - 1);} else {dfs(i, j - 1);}path.push_back(edit[i][j]);
}void DP() {// 初始化for(int i = 0; i <= n; i++) {dp[i][0] = i;edit[i][0] = 0;}for (int i = 0; i <= m; i++) {dp[0][i] = i;edit[0][i] = 3;}// 求出最短操作数,并记录状态转移路径for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {if (a[i] == b[j]) {dp[i][j] = dp[i - 1][j - 1];edit[i][j] = 2;} else {int op = 3;dp[i][j] = dp[i][j - 1] + 1;if (dp[i][j] > dp[i - 1][j] + 1) {op = 0;dp[i][j] = dp[i - 1][j] + 1;}if (dp[i][j] > dp[i - 1][j - 1] + 1) {op = 1;dp[i][j] = dp[i - 1][j - 1] + 1;}edit[i][j] = op;}}}cout << dp[n][m] << endl;// 反推出具体操作dfs(n, m);// path[1] = 1;for (int i = 0; i < path.size(); i++){cout << path[i];}
}void solve() {int x;while (cin >> x, x != -1) {n++;a[n] = x;}while (cin >> x, x != -1) {m++;b[m] = x;}DP();
}int main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cout << fixed;cout.precision(18);solve();return 0;
}

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

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

相关文章

Jmeter二次开发实现rsa加密

jmeter函数助手提供了大量的函数&#xff0c;像 counter、digest、random、split、strLen&#xff0c;这些函数在接口测试、性能测试中大量被使用&#xff0c;但是大家在实际工作&#xff0c;形形色色的测试需求不同&#xff0c;导致jmeter自带或者扩展插件给我们提供的函数无法…

【反向代理】反向代理及其作用

反向代理及其作用 一、什么是正向代理 在介绍反向代理之前我们先介绍什么是正向代理 首先要明确的是&#xff0c;在http协议中正向代理一般被称为代理&#xff0c;在web服务中我们可以通过主动配置代理服务器的方式来发送请求&#xff0c;并通过代理服务器接收服务器的响应。…

时序预测 | MATLAB实现Hamilton滤波AR时间序列预测

时序预测 | MATLAB实现Hamilton滤波AR时间序列预测 目录 时序预测 | MATLAB实现Hamilton滤波AR时间序列预测预测效果基本介绍程序设计参考资料预测效果 基本介绍 预测在很大程度上取决于适合周期的模型和所采用的预测方法,就像它们依赖于过滤器提取的周期一样。标准 Hodrick-P…

【DBA课程-笔记】第 3 章:MongoDB数据库核心知识

内容 一、MongoDB 数据库架构 A. MongoDB数据库体系架构 1. 存储引擎&#xff08;MongoDB Storage Engines&#xff09;&#xff1a; 2. MongoDB 数据逻辑架构 二、MongoDB 存储引擎 A. 查看mongodb服务器的状态 B. 查看引擎信息&#xff08;4.2.1 没有这个命令&#xf…

火山引擎徐广治:边缘云,下一代云计算

6月30日&#xff0c;2023稀土开发者大会在北京举办。大会以「代码不止&#xff0c;掘金不停」为主题&#xff0c;与上百位海内外技术专家一起剖析行业最新动态&#xff0c;为一直在路上的技术开发者们&#xff0c;拓宽技术视野&#xff0c;传播前沿的技术理念。火山引擎边缘云资…

给LLM装上知识:从LLM+LangChain的本地知识库问答到LLM与知识图谱的结合

前言 过去半年&#xff0c;随着ChatGPT的火爆&#xff0c;直接带火了整个LLM这个方向&#xff0c;然LLM毕竟更多是基于过去的经验数据预训练而来&#xff0c;没法获取最新的知识&#xff0c;以及各企业私有的知识 为了获取最新的知识&#xff0c;ChatGPT plus版集成了bing搜…

1770_VirtualBox下安装Debian

全部学习汇总&#xff1a; GreyZhang/little_bits_of_linux: My notes on the trip of learning linux. (github.com) 作为我自己的日常使用&#xff0c;Debian基本上没有出现过。最多是让它运行在某个设备上作为一个服务的平台&#xff0c;因为很多东西我懒得去配置。 Debia…

android editText获取不到数据

问题分析&#xff1a;在onActivityCreated一开始就创建了findViewById&#xff0c;这时获取的是默认值&#xff0c;需要在点击按钮时重新加载才能获取到输入数据。 需要在点击按钮时重新加载数据&#xff1a;

氢辉能源|[4GW]质子交换膜产线投产发布会暨[3MW]PEM电解槽正式交付

2023年7月12日下午&#xff0c;氢辉能源&#xff08;深圳&#xff09;有限公司&#xff08;以下简称氢辉能源&#xff09;质子交换膜产线投产发布会暨12台50标方3MW电解槽交付仪式在深圳市龙岗区国际低碳城成功举办。 此外&#xff0c;氢辉能源与远景能源、润世华集团、宏洲新能…

arcgis实现影像监督分类

1、打开ArcMap,右击空白处打开影像分类工具栏&#xff0c;如下&#xff1a; 2、打开影像&#xff0c;如下&#xff1a; 打开的影像由于未经处理&#xff0c;颜色看起来很昏暗&#xff0c;这时候可以拉伸一下。具体操作&#xff0c;右击图层选择属性&#xff0c;如下&#xff1a…

vue+relation-graph绘制关系图实用组件

先在终端执行命令 vue create relationgraph创建一个vue2的项目 然后在编辑器中打开新创建的项目 在终端中执行命令 npm install relation-graph --save引入依赖 这样 我们relation-graph就进来了 然后 我们在需要使用的组件中编写代码如下 <template><div>&…

使用IDEA工具debug java annotation processors

最近看Spring提供的自动生成spring-configuration-metadata.json文件的组件。组件依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</opti…