题目

写电子邮件是有趣的,但不幸的是经常写不好看,主要是因为所有的行不一样长,你的上司想要发排版精美的电子邮件,你的任务是为他编写一个电子邮件排版程序。

完成这个任务最简单的办法是在太短的行中的单词之间插入空格,但这并不是最好的方法,考虑如下例子:


This is the example you are

actually considering.

假设我们想将第二行变得和第一行一样长,靠简单地插入空格则我们将得到如下结果:


This is the example you are

actually considering.

但这太难看了,因为在第二行中有一个非常大的空白,如果将第一行的单词“are”移到下一行我们将得到较好的结果:


This is the example you

are actually considering.

当然,这必须对难看程度进行量化。因此我们必须给出单词之间的空格的难看程度,一个包含N个空格符的空白段,其难看程度值为(n-1)2,程序的目的是使难看程度的总和最小化。例如,第一个例子的难看程度是1+7*7=50,而第二个例子的难看程度仅为1+1+1+4+1+4=12。

输出时,每一行的开头和结尾处都必须是一个单词,即每行开头和结尾处不能有空白。唯一例外的是该行仅有一个单词组成的情况,对于这种情况你可将单词放在该行开头处输出,此时如果该单词比该行应有的长度短则我们指定它的最坏程度为500,当然在这种情况下,该行的实际长度即为该单词的长度。

输入描述 Input Description
输入文件第一行是一个整数N,表示该段要求达到的宽度,1<=N<=80。该段文章由一个或多个单词组成,单词由ASCII码值为33到126(包含33和126)的字符组成,单词与单词之间用空格隔开(可能超过一个)。单词长度不会超过段落要求达到的宽度。一段文字所有单词的总长度不会超过10000个字符,任何一行都不会超过100个字符,任何一个单词都在同一行内。

输出描述 Output Description
对于每个段落,找出使其难看程度最小的排版形式并输出句子:“Minimal badness is B.”,B是指按可能的最好排版形式会发生的难看程度值。注意排版后文本行数任意,多余的空格也可删除。

样例输入 Sample Input
28
This is the example you are
actually considering.

样例输出 Sample Output
Minimal badness is 12.

解题思路

dp[i]表示第i个单词放在当前行的最后的最小难看程度。因为题目规定了每一行的开始和结束必须是单词。
dp[i] <= dp[j] + tmp tmp是[j + 1, i] 的最小值。

代码

#include <iostream>
#include <cstring>
#include <stdio.h>
#include <algorithm>
#include <cmath>
#include <map>
#include <vector>
using namespace std;int width;
int len[10010];
int dp[10010];
int nums;
int main() {cin >> width;string tmp;nums = 0;while(cin >> tmp) {nums ++;len[nums] = len[nums - 1] + tmp.size();}memset(dp,0,sizeof(dp));for(int i = 1;i <= nums;i ++) {if(len[i] - len[i - 1] == width) dp[i] = dp[i - 1];else dp[i] = dp[i - 1] + 500;for(int j = i - 2;j >= 0;j --) {//j + 1 ---> iint tot = i - j - 1; //i - (j + 1) + 1 - 1;int blanks = width - (len[i] - len[j]);  if(blanks < tot) continue; // widht - (len[i] - len[j]) < i - j - 1int avg = blanks / tot;int rmd = blanks % tot;int tmp =  rmd * (avg * avg) + (tot - rmd) * (avg - 1) * (avg - 1);dp[i] = min(dp[i],dp[j] + tmp);}}printf("Minimal badness is %d.\n",dp[nums]);
}

线性动态规划-文件排版相关推荐

  1. 文件排版,较难的线性dp

    文件排版 写电子邮件是有趣的,但不幸的是经常写不好看,主要是因为所有的行不一样长,你的上司想要发排版精美的电子邮件,你的任务是为他编写一个电子邮件排版程序. 完成这个任务最简单的办法是在太短的行中的单 ...

  2. 【动态规划】线性动态规划

    吐槽:动态规划这个东西,只要推不出状态转移方程,一切都白搭 基础知识 一. 动态规划 动态规划中最重要的三个概念:最优子结构,重复子问题,无后效性. 最优子结构:如果问题的最优解所包含的子问题的解也是 ...

  3. 第十七章:线性动态规划

    通过上一章对01背包问题的学习,我相信同学们都动态规划都有了一个新的认识.在我们利用动态规划解决问题的过程通常会有以下几个常见的专业术语,分别是:状态定义,状态的转移,初始化和边界条件.下面我们对这几 ...

  4. 桐爷开车 线性动态规划

    题目描述 桐爷人称计科老司机,有天要从深圳跑长途去帝都.桐爷的塞恩车每跑一千米耗油一升.塞恩车的油箱容量为200升.桐爷出发时有100升油,为了造成少耗油的假象到达帝都时至少有100升油.沿途有不少加 ...

  5. 文件排版(文本文件读写)

    前言 我现在学习文件的输入与输出,写下此篇博客充当学习笔记 问题回顾 英文电影中参演人员名单一般以某种方式进行排版显示.给定一个未排版的文件listin.txt,该文件中每行参演人员名单由冒号ldqu ...

  6. 文件排版1(C语言)

    [问题描述] 英文电影中参演人员名单一般以某种方式进行排版显示.给定一个未排版的文件listin.txt,该文件中每行参演人员名单由冒号":"分隔成前后两部分,但格式杂乱无章,单词 ...

  7. 实验十 文件读写 1. 文件排版(文本文件读写)

    [问题描述] 英文电影中参演人员名单一般以某种方式进行排版显示.给定一个未排版的文件listin.txt,该文件中每行参演人员名单由冒号ldquo:rdquo分隔成前后两部分,但格式杂乱无章,单词(由 ...

  8. 文件排版2.2 (python)

    项目场景: 提示:这里简述项目相关背景: python练习题 问题描述: 提示:这里描述项目中遇到的问题: 英文电影中参演人员名单一般以某种方式进行排版显示.给定一个未排版的文件listin.txt, ...

  9. python字符串问题—文件排版

    问题描述 [问题描述] 英文电影中参演人员名单一般以某种方式进行排版显示.给定一个未排版的文件listin.txt,该文件中每行参演人员名单由冒号':'分隔成前后两部分,但格式杂乱无章,单词(由除空格 ...

最新文章

  1. 100_框架对象事件
  2. 优秀的java代码_像这样写,Java菜鸟也能写出牛逼的代码
  3. PDU (Protocol Data Unit) - 协议数据单元
  4. Docker最全教程之Python爬网实战(二十二)
  5. 4.Scala-数据结构
  6. Data Mining with R
  7. ACM算法-逃离机场
  8. Visio 安装后提示 Dos 共享冲突
  9. SU插件情报局 | Thom Thom:3D文本编辑器
  10. ES3数组和字符串的方法
  11. html光标自动定位到文本框,进入JSP页面时就将光标定位到指定的文本框中
  12. 【应急响应】Linux下变种DDG挖矿应急处理总结
  13. 攻防世界 web 进阶 ics-07
  14. 3岁孩子能力训练计划
  15. IoT Analytics:物联网2020年回顾,十大重要进展
  16. 游戏策划小白笔记——Common Sense(一)
  17. SCI期刊名缩写查询
  18. is not eligible for getting processed by all BeanPostProcessors
  19. 使用ALTER USER命令修改用户的密码、密码过期,锁定,解锁
  20. LCD与DLP投影仪简介

热门文章

  1. Linux笔记本 安装 qq/TIM/微信/百度网盘......解决方案
  2. Unity让物体跟随鼠标移动
  3. CUDA——线程束分化
  4. Vscode下载安装使用教程_Vscode搭建Python开发环境_Vscode常用插件
  5. MindManager思维导图画法教程
  6. php问答系统模板,tipask问答系统
  7. threejs正方体六面贴图
  8. 漫谈唯一设备ID,android开发工程师
  9. node生成唯一设备id(node-machine-id)
  10. 部署Gbase 8c的系统要求