问题描述:

要参加某项比赛,参赛人员需要排成两队(分别定义为A和B,每队人数至少为1且每队人数随意)。每人写一个字母代表自己,字母为a-z或A-Z。例如A对的字母为:c m c,B对字母为:s n m n。

最佳队形为:

1. 每个人前后可有任意个空位,也可以没有空位;

2. 两队在添加空位后长度必需一致。

3. 根据每个人所写的字母,定义A对于B队的距离为相应位置上的字母的距离总和;

4. 两队相应位置的距离定义为:

1)两个非空位的距离定义为它们所对应字母的ASCII码的差的绝对值;

2)空位与其他任意非空位之间的距离为已知的定值K;

3)空位与空位的距离为0.

5. 最佳队形为:在A,B的所有可能的队形中,必定存在等长的队A1,B1,使得A1和B1的距离最小。那么这个队形就是最佳队形。

问题分析:

算法设计中常用的算法思想是枚举,回溯,分治,贪心,动归。显然此题用动归较易解决。动归的关键是定义子问题以及子问题之间的关系,当然,也需要找出最小子问题即能够直接求解出的问题。

我们定义如下子问题形式:

dp(i,j)表示A(1,i)和B(1,j)的最佳队形的长度。那么,问题就是求解出dp(len(A),len(B))。

动归关系式:

dp(i,j) =  min {  dp(i-1,j)+K, dp(i,j-1)+K, dp(i-1,j-1) + abs(A(i)-B(j))   }

最小子问题:

A(1,i)或B(1,j)与空格之间的距离。

代码实现:

#include <iostream>
#include <vector>
#include <string>
using namespace std;int GetBestQueue(string& A, string& B,int K)
{
        int Alength = A.length();int Blength = B.length();vector<vector<int> > dp(Alength + 1,vector<int>(Blength+1));
       // Initial the array dpfor (int i = 1; i <= Alength; i++)dp[i][0] = i*K;for (int i = 1; i <= Blength; i++)dp[0][i] = i*K;dp[0][0] = 0;
       //Solutionfor (int i = 1; i <= B.length(); i++){for (int j = 1; j <= A.length(); j++){if (dp[j - 1][i] < dp[j][i - 1])dp[j][i] = dp[j - 1][i] + K;elsedp[j][i] = dp[j][i - 1] + K;
                        int tem = abs(A[j - 1] - B[i - 1]);
if (dp[j][i] > dp[j - 1][i - 1] + tem)dp[j][i] = dp[j - 1][i - 1] + tem;}}return dp[Alength][Blength];
}

最佳队形(动态规划)相关推荐

  1. 打不开磁盘配额linux,九度OJ 1455 珍惜现在,感恩生活 -- 动态规划(背包问题)...

    题目描述: 为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,而市场有m种大米,每种大米都是袋装产品,其价格不等,并且只能整袋购买.请问:你用有限的资金最 ...

  2. 【算法】动态规划 ① ( 动态规划简介 | 自底向上的动态规划示例 | 自顶向下的动态规划示例 )

    文章目录 一.动态规划简介 二.自底向上的动态规划示例 1.原理分析 2.算法设计 3.代码示例 三.自顶向下的动态规划示例 1.算法设计 2.代码示例 一.动态规划简介 动态规划 , 英文名称 Dy ...

  3. 《人工智能及其应用》1-6章

    目录 第一章 绪论 1.1 人工智能的定义与发展 1.1.1 人工智能的定义 1.1.2 人工智能的起源与发展 1.2 人工智能的各种认知观 1.2.1 人工智能各学派的认知观 1.2.2 人工智能的 ...

  4. 2017-2018年度刷题记录

    2018暑假刷题1: T1.CF6A Triangle (#模拟 -1.4) T2.CF59A Word(#模拟 -1.5) T3.[洛谷]P2772 寻找平面上的极大点(#贪心 -1.4) T4.[ ...

  5. 2023 华为OD机试备考攻略 以及题库目录分值说明 考点说明 (A卷+ B卷)

    文章目录 华为OD在线刷题OJ 华为题库 更新说明 支持的语言 题库目录 华为OD统一考试[A卷]题库-100分 华为OD统一考试[A卷]题库-200分 华为OD统一考试[B卷]题库-100分 华为O ...

  6. leetcode 309. Best Time to Buy and Sell Stock with Cooldown | 309. 最佳买卖股票时机含冷冻期(动态规划)

    题目 https://leetcode.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/ 题解 我知道要dp,但是不知道要怎么dp ...

  7. 【必备算法】动态规划:LeetCode题(九)309. 最佳买卖股票时机含冷冻期,714. 买卖股票的最佳含手续费

    买卖股票系列: [必备算法]动态规划:一个思路解决六道股票问题 [必备算法]动态规划:LeetCode题(七)121. 买卖股票的最佳时机,122. 买卖股票的最佳时机 II [必备算法]动态规划:L ...

  8. LeetCode 1615. 最大网络秩 / 2389. 和有限的最长子序列 / 1626. 无矛盾的最佳球队(排序+动态规划)

    1615. 最大网络秩 2023.3.15 每日一题 题目描述 n 座城市和一些连接这些城市的道路 roads 共同组成一个基础设施网络.每个 roads[i] = [ai, bi] 都表示在城市 a ...

  9. 动态规划练习2 [合唱队形]

    N 位同学站成一排,音乐老师要请其中的 (N-K) 位同学出列,使得剩下的 K 位同学排成合唱队形. 合唱队形是指这样的一种队形:设 K 位同学从左到右依次编号为 1 , 2 -, K ,他们的身高分 ...

最新文章

  1. 【组队学习】【33期】3. 李宏毅机器学习(含深度学习)
  2. [黑金原创教程] FPGA那些事儿《数学篇》- CORDIC 算法
  3. IPC 之 Binder 初识
  4. 通过索引优化含ORDER BY的MySQL语句
  5. 2015-03-17 current note creation logic in my task
  6. java使用教程——组件及事件处理——窗口(设置窗口的颜色和背景)
  7. 面试常考题:不调用库函数,怎样实现字符串操作函数?
  8. Dynamics AX 2012 Manufacturing (Part 1)
  9. java截取视频第一帧图片
  10. 银行传统支付通道与支付平台结合
  11. ahk键盘增强✨✨✨v1.1
  12. SU插件情报局 | Selection Toys 过滤选择(附插件安装包)
  13. ATTCK实战系列——红队实战(二)
  14. Qt笔记(六十三)之Qt实现窗口以及控件的全屏效果
  15. Spring Data JPA + QueryDSL
  16. 视频编码的守望者--Jason Garrett-Glaser
  17. 插入, 桥 - 面面相连
  18. nginx实现路由转发
  19. python升级到3.7版本安装pyaudio
  20. 贤者之路,Cuda block内部矩阵求逆,mxm矩阵 复杂度为O(m)

热门文章

  1. HAO123的迷思--谈谈seo搜索引擎优化
  2. 华为电脑安装双系统linux,matebook的win+ubuntu双系统安装方法
  3. 双样本拟合优度的临界值求解
  4. 前方高能!12年高级工程师的“飞升之路”,带你碾压面试官!
  5. css3动画效果模板
  6. 添加鼠标按钮html代码,HTML MouseEvent buttons用法及代码示例
  7. 工资条里藏着这些小秘密,第一个就有很多人不知道!
  8. CS231n 计算机视觉(学习笔记)第七章(0809)
  9. Ubuntu中的输入法突然变成了繁体字解决办法及中英输入法切换
  10. detectron2训练自己的数据集(只包含一类数据)