【计算机算法设计与分析】漂亮打印问题(C++_动态规划)

文章目录

    • 问题描述
    • 算法原理
    • 算法实现
    • 参考资料

问题描述

       给定由n个英文单词组成的一段文章,每个单词的长度 (字符个数)依序为 l 1 , l 2 , . . . , l n l_1, l_2, ..., l_n l1,l2,...,ln。要在一台打印机上将这段文章“漂亮”地打印出来。打印机每行最多可打印 M个字符。这里所说的“漂亮”的定义如下:在打印机所打印的每一行中,行首和行尾可不留空格;行中每两个单词之间留一个空格;如果在一行中打印从单词i到单词j的字符,则按打印规则,应在一行中恰好打印 Σ k = i j l k + j − i \Sigma_{k=i}^{j}l_k+j-i Σk=ijlk+ji个字符(包括字间空格字符),且不允许将单词打破;多余的空格数为 M − Σ k = i j l k − j + i M-\Sigma_{k=i}^{j}l_k-j+i MΣk=ijlkj+i;除文章的最后一行外,希望每行多余的空格数尽可能少。因此,以各行(最后一行除外)的多余空格数的立方和达到最小作为“漂亮”的标准。试用动态规划算法设计一个“漂亮打印”方案,并分析算法的计算复杂性。

算法原理

本题使用动态规划算法求解,需要维护三个数组,分别是:

  • extra[i][j]:表示如果第i到第j个单词放到同一行,那么这行有多少个剩余空格;
  • lc[i][j]:从第i到第j个单词放到同一行,那么这行空格数的立方值。维护这个数组会出现以下三种情况:
    • extra[i][j] < 0(本行由于字符数M限制,不能容纳i到j个单词):lc[i][j] = INF;
    • j == n && extra[i][j] >= 0(文章最后一行,不计入统计范围):lc[i][j] = 0;
    • 除以上两种情况之外:lc[i][j] = extra[i][j]的立方;
  • c[i]:文章从第1到j个单词的空格立方之和;

动态规划状态转移方程如下:
l c [ i ] [ j ] = { inf ⁡ , e x t r a [ i ] [ j ] < 0 0 , j = = n & & e x t r a [ i ] [ j ] > = 0 ( e x t r a s [ i ] [ j ] ) 3 , e l s e lc[i][j]=\left\{ \begin{aligned} \inf , & &{extra[i][j]<0}\\ 0,& &{ j == n \&\& extra[i][j] >= 0 }\\ (extras[i][j])^3, & &{else}\\ \end{aligned} \right. lc[i][j]= inf,0,(extras[i][j])3,extra[i][j]<0j==n&&extra[i][j]>=0else
c [ j ] = { 0 , j = 0 m i n ( c [ i − 1 ] + l c [ i ] [ j ] , c [ j ] ) , j > 0 c[j]=\left\{ \begin{aligned} 0, & &{j=0}\\ min(c[i - 1] + lc[i][j], c[j]),& &{j>0}\\ \end{aligned} \right. c[j]={0,min(c[i1]+lc[i][j],c[j]),j=0j>0

综上,我们得到这三个数组,那又该如何得出每行的划分位置呢?

       在每次更新c[j]时记录position[j] = i,即对于以单词j为结尾的一行来说,本行最佳起始位置为单词i。由于动态规划更新的每一个数值都是当前及之前的最优解,因此全局最优解就是最后一个数值。position数组中很多值都是无意义的,因为动态规划是从前往后算的,但是只有最后的数值才是全局的最优,输出时由果导因,即从后往前看。

算法实现

#include <bits/stdc++.h>
#define INF 1000
using namespace std;int wordsLen(int wordsL[], int i, int j) {//计算从i到j的单词总长度int sum = 0;for (int k = i; k <= j; k++) {sum += wordsL[k];}return sum;
}int main() {int n, M, extra[100][100], lc[100][100], c[100], l[100], position[100];string words[100];c[0] = 0;cin >> n >> M;//n个单词,每行最多M个字符for (int i = 1; i <= n; i++) {cin >> words[i];l[i] = words[i].size();c[i] = INF;}for (int i = 1; i <= n; i++) {  //此行从第i个开始放for (int j = i; j <= n; j++) {  //放到第j个extra[i][j] = M - j + i - wordsLen(l, i, j);  //如果i到j放到一行,那么这行有多少个剩余空格if (extra[i][j] < 0)  //这行放不下这么多单词lc[i][j] = INF;else if (j == n && extra[i][j] >= 0)  //最有一行lc[i][j] = 0;else  //正常情况lc[i][j] = pow(extra[i][j], 3);if (c[i - 1] + lc[i][j] < c[j]) {  //从i处分行是否空格更少c[j] = c[i - 1] + lc[i][j];  //整篇文章从1到j存放单词的空格立方之和//position数组很多值都是无意义的,因为动态规划是从前往后算的,但是只有最后的数值才是全局的最优,输出时由果导因,即从后往前看。position[j] = i;  //对于以j为结尾的一行来说,本行最佳起始位置为i}}}stack<int> st;int i = n;while(i>0) {st.push(position[i]);i = position[i]-1;}st.pop();for (int i = 1; i <= n; i++) {if (!st.empty()&&i == st.top()){cout << endl;st.pop();}cout << words[i] << ' ';}cout << "\n总剩余空格数:" << c[n];return 0;
}
/*
10 8
abc de h polq cs opaqe gh t asd th
*/

参考资料

  1. 动态规划之整齐打印
  2. 动态规划——漂亮打印问题

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

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

相关文章

基于SpringBoot的公司进销存管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SpringBoot的公司进销存管理系统,ja…

轻量检测模型PP-PicoDet解析

Paper&#xff1a;PP-PicoDet: A Better Real-Time Object Detector on Mobile Devices official implementation&#xff1a;https://github.com/PaddlePaddle/PaddleDetection/tree/release/2.7/configs/picodet Backbone 作者通过实验发现&#xff0c;ShuffleNetV2在移动…

NeRF-RPN: A general framework for object detection in NeRFs 全文翻译

摘要 Abstract 本文提出了第一个重要的物体检测框架 NeRF-RPN&#xff0c;它直接在 NeRF 上运行。给定一个预先训练好的 NeRF 模型&#xff0c;NeRF-RPN 的目标是检测场景中所有物体的边界框。通过利用包含多尺度三维神经体积特征的新颖体素表示法&#xff0c;我们证明…

ubuntu环境安装配置nginx流程

今天分享ubuntu环境安装配置nginx流程 一、下载安装 1、检查是否已经安装 nginx -v 结果 2、安装 apt install nginx-core 过程 查看版本&#xff1a;nginx -v 安装路径&#xff1a;whereis nginx nginx文件安装完成之后的文件位置&#xff1a; /usr/sbin/nginx&#xf…

MySQL中UNION和UNION ALL的区别有哪些?

在MySQL中如何想要对两个结果集进行合并操作&#xff0c;可以使用UNION和UNION ALL&#xff0c;如果只是想要去除掉重复的记录&#xff0c;属于UNION ALL 即可&#xff0c;但是如何想要除掉没有重复行数据&#xff0c;就要使用Union。本文详细向大家介绍MySQL中UNION和UNION AL…

Axure鲜花商城网站原型图,网上花店订花O2O本地生活电商平台

作品概况 页面数量&#xff1a;共 30 页 兼容软件&#xff1a;仅支持Axure RP 9/10&#xff0c;非程序软件无源代码 应用领域&#xff1a;鲜花网、花店网站、本地生活电商 作品特色 本作品为「鲜花购物商城」网站模板&#xff0c;高保真高交互&#xff0c;属于O2O本地生活电…

OpenVINS学习5——VioManager.cpp/h学习与注释

前言 之前又看到说VioManager.cpp/h是OpenVINS中的核心程序&#xff0c;这次就看看这里面都写了啥&#xff0c;整体架构什么样&#xff0c;有哪些函数功能。具体介绍&#xff1a; VioManager类 整体分析 VioManager类包含 MSCKF 工作所需的状态和其他算法。我们将测量结果输…

python的课后练习总结3之条件语句

1,简单点&#xff0c;只有IF IF 后面加入条件然后冒号: 条件成立执行的代码1 条件成立执行的代码2 条件是否成立都执行的代码 身高 float(input(请输入你的身高(米):)) if 身高 > 1.3:print(f您的身高是{身高}米,请您买票) print(祝您旅途愉快) 2,IF 加个else if 条件:…

Spring AOP的环境搭建、切入点表达式、通知注解

Spring AOP的实现 Spring AOP环境搭建AOP坐标依赖引入添加xml配置实现三层架构 定义切入点Pointcut("匹配规则")切入点表达式1. 执行所有的公共方法2.执行任意的set方法3.设置指定包下的任意类的任意方法 (指定包: com.svt.service)4.设置指定包及于包下的任意类的任…

医院信息系统集成平台—病人主索引(MPI)

随着医院信息化程度的不断深入,应用的不断扩展。在各级、各类医疗或者医院信息系统中作为医疗服务以及信息系统中信息发生源的主体――病人(Patient)的信息保持正确性与唯一性体现的越来越重要,随之产生MPI(Master Patient Index 病人主索引)的概念,随着区域级以及医院级多…

数学建模2023-A太阳镜厂代码认识

Pnp.column_stack((p1,new_column)) #得到每个镜子的x,y,z序列 nlnl/np.linalg.norm(nl) #得到单位法向量 for dx in np.arange(-W/2,W/20.1,delta_t): indices_in_circlenp.where(Dis[:,i]1)[0] #取周围半径 Di_bTb.T.dot(Di_d-B) #A镜上的点 从地面坐标系->B镜坐标系 总…

用 Python 抓取 bilibili 弹幕并分析!

01 实现思路 首先&#xff0c;利用哔哩哔哩的弹幕接口&#xff0c;把数据保存到本地。接着&#xff0c;对数据进行分词。最后&#xff0c;做了评论的可视化。 02 弹幕数据 平常我们在看视频时&#xff0c;弹幕是出现在视频上的。实际上在网页中&#xff0c;弹幕是被隐藏在源代码…

【熔断限流组件resilience4j和hystrix】

文章目录 &#x1f50a;博主介绍&#x1f964;本文内容起因resilience4j落地实现pom.xml依赖application.yml配置接口使用 hystrix 落地实现pom.xml依赖启动类上添加注解接口上使用 &#x1f4e2;文章总结&#x1f4e5;博主目标 &#x1f50a;博主介绍 &#x1f31f;我是廖志伟…

【期末复习向】数据可视化技术

一、重点复习 题型&#xff1a;填空题&#xff08;15道&#xff0c;2分一个&#xff09;与简答题&#xff08;3道题目&#xff0c;10分一个&#xff09;与绘图题&#xff08;选画2个类型的图&#xff09; 1.什么是数据可视化 在计算机视觉领域&#xff0c;数据可视化是对数据的…

Linux 进程(八) 进程的退出码

main 函数的返回值叫做进程的退出码。当进程成功退出的时候&#xff0c;我们一般用0来表示。进程失败的时候一般用非零来表示。我们使用不同的数字来表示进程退出时不同的失败原因。 我们查看系统的有多少退出码以及其含义时需要用到strerror() 他的头文件和用法如下。 通过一…

CSS 放大旋转动画

<template><div class"container" mouseenter"startAnimation" mouseleave"stopAnimation"><!-- 旋方块 --><div class"box" :class"{ rotate-scale-up: isAnimating }"><!-- 元素内容 -->&l…

从零开始搭建企业级前端项目模板(vue3+vite+ts)

文章目录 主要内容一、vite脚手架工具初始化项目二、项目代码加入eslint校验和自动格式化2.1安装对应依赖插件2.2 配置script脚本&#xff0c;项目安装eslint配置2.3 安装完成后&#xff0c;后面启动项目还缺少一些依赖&#xff0c;提前按需安装好 三&#xff0c;修改eslintrc.…

3D目标检测(教程+代码)

随着计算机视觉技术的不断发展&#xff0c;3D目标检测成为了一个备受关注的研究领域。与传统的2D目标检测相比&#xff0c;3D目标检测可以在三维空间中对物体进行定位和识别&#xff0c;具有更高的准确性和适用性。本文将介绍3D目标检测的相关概念、方法和代码实现。 一、3D目…

2023年12月青少年软件编程Python等级考试(三级)真题试卷

2023年12月青少年软件编程Python等级考试&#xff08;三级&#xff09;真题试卷 题目总数&#xff1a;38 总分数&#xff1a;100 选择题 第 1 题 单选题 一个非零的二进制正整数&#xff0c;在其末尾添加两个“0”&#xff0c;则该新数将是原数的&#xff1f;&#x…

nuxt3 env文件、全局变量处理

有两种方向 通过配置nuxt.config.ts Nuxt提供的钩子函数&#xff0c;实现全局变量的获取 runtimeconfig env文件往runtimeconfig放入内容 useAppConfig 通过env文件配置来获取服务端全局变量&#xff0c;客户端通过vite.define实现 nuxt.config.ts Nuxt钩子 1. runtim…