文件排版

写电子邮件是有趣的,但不幸的是经常写不好看,主要是因为所有的行不一样长,你的上司想要发排版精美的电子邮件,你的任务是为他编写一个电子邮件排版程序。
完成这个任务最简单的办法是在太短的行中的单词之间插入空格,但这并不是最好的方法,考虑如下例子:
****************************
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,当然在这种情况下,该行的实际长度即为该单词的长度。

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

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

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

输出:
Minimal badness is 12.

一看到这道题

设dp(i,j)表示前个单词构成j行的最小丑陋程度

于是dp(i,j)=min{dp(k,j-1)+丑陋程度(k+1---i)(k为可行解)}

然而我发现了一个问题:题目中并没有说明要安排多少行所以j并没有必要作为一维;QAQ;

所以我们新定义一个状态dp(i)表示前i个单词的最小丑陋程度

于是dp(i)表示前个单词的最小丑陋程度

dp(i)=min{dp(j)+丑陋程度(j+1--i)}

答案为dp(单词总数);

时间复杂度O(n^2)

空间复杂度O(n)

时间复杂的还可以进行进一步的优化(省去暴力枚举)

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int inf=0x3f3f3f3f;
int lim,n,sum[10001],f[10001];
int calc(int l,int r){if(!(l^r)){if(!((sum[r]-sum[l-1])^lim))return 0;return 500;}int t=lim-sum[r]+sum[l-1];if(t<r-l)return inf;int m=t/(r-l),k=t-m*(r-l);m--;return 1LL*m*m*(r-l)+1LL*k*(m<<1|1);
}
int main(){char ch[101];scanf("%d",&lim);while(~scanf("%s",ch))sum[++n]=sum[n-1]+strlen(ch);f[0]=0;for(int i=1;i<=n;i++)f[i]=inf;for(int i=1;i<=n;i++)for(int j=1;j<=i;j++)f[i]=min(f[i],f[j-1]+calc(j,i));printf("Minimal badness is %d.\n",f[n]);return 0;
}

  

转载于:https://www.cnblogs.com/star-eternal/p/7560092.html

文件排版,较难的线性dp相关推荐

  1. CodeVS 1300 文字排版 线性DP

    1300 文件排版 时间限制: 1 s 空间限制: 128000 KB 题目描述 Description 写电子邮件是有趣的,但不幸的是经常写不好看,主要是因为所有的行不一样长,你的上司想要发排版精美 ...

  2. 0x51.动态规划 - 线性DP(习题详解 × 10)

    目录 0x51.动态规划 - 线性DP 0x51.1 LIS问题 Problem A. 登山 (最长下降子序列) Problem B. 友好城市(思维) Problem C. 最大上升子序列和 0x5 ...

  3. [nk] 糟糕的打谱员 线性DP

    前言 线性DP是世界上最难的算法!!(我在口胡) 前言 : https://ac.nowcoder.com/acm/contest/11215/C 思路 看完该题之后 (问的什么鬼 贪心?排序之后交替 ...

  4. leetcode 2188 归约后线性dp

    此题第一次看较为复杂,但有几个条件比较重要,一个是每种轮胎都是无限个,这个减少了太多难度,此题最难想的地方是,不要想选哪个轮胎,走多久,而是看一段固定的距离,哪个轮胎走花的时间最短.因为最终一定是分成 ...

  5. UVA11584 划分成回文串 Partitioning by Palindromes(线性DP划分+DP判断回文串)

    整理的算法模板合集: ACM模板 依旧是线性DP 我们使用闫氏DP分析法 总体DP转移的时间复杂度为O(n2)O(n^2)O(n2). 但是这里牵扯到判断 i\tt ii 到 j\tt jj 是否为回 ...

  6. 洛谷P2401 不等数列(线性DP)

    本题使用的是线性DP.就是DP数组难以思考,这里我直接给出 dp[i][j]:表示 1 ~ i 这 i 个数 , 其中j 个 " < " 有几种方法 假设我们已经把 n - ...

  7. CodeForces - 1096D Easy Problem(线性dp)

    题目链接:点击查看 题目大意:给出一个字符串,每个字符都有一个权值,现在需要删除权值和最少的字符,满足字符串中不再含有子序列"hard" 题目分析:线性dp,但我不会,看着题解写的 ...

  8. CodeForces - 456C Boredom(线性dp)

    题目链接:点击查看 题目大意:给出一个由n个数字组成的数列,现在给出规则是,每次选择数列中的一种数字 x,选择后的贡献为 x,不过操作后会删除掉所有数值为 x + 1 和 x - 1 的数,现在问如何 ...

  9. POJ - 1050 To the Max(最大连续子段和,线性dp)

    题目链接:点击查看 题目大意:给出一个n*n的矩阵,每个点都有一个权值,现在要从中选取一个子矩阵要求权值和最大,问这个最大权值和是多少 题目分析:因为是要求子矩阵的权值和最大的问题,我们可以直接维护一 ...

最新文章

  1. Datawhale与Tianchi助力产学研融合-华北电力大学专场
  2. QT之计算器代码重构(六)
  3. php检测目录,php检测文件目录大小类
  4. 【H.264/AVC视频编解码技术】第六章【指数哥伦布编码】
  5. tensorflowgpu利用率为0_直流电压利用率的提高方法-梯形波调制法
  6. R语言基础入门(9)之因子类型
  7. 技术专家:为什么我们最终选择Apache Pulsar替代Kafka?
  8. Visual Studio 2019 v16.9 Preview 3 发布
  9. mysql .myi权限_Day02-a.m.-MySQL体系结构与用户权限管理
  10. (转)每个人都应该读一读贝索斯的致股东信 1997-2016
  11. [POI2013]MOR-Tales of seafaring
  12. 最新cs1.6服务器ip地址,CS1.6 IP地址大全(死亡奔跑等)
  13. 基于asp.net固定资产管理系统设计
  14. 计算机图形学透视投影知识点,计算机图形学
  15. 解决联想小新air13pro笔记本电脑插入耳机没声音的问题
  16. 学习java框架-J2EE体系-Spring-IOC-AOP-Bean-事务-
  17. Pycharm 许可证过期解决
  18. 斯坦福大学-自然语言处理入门 笔记 第十四课 CGSs和PCFGs
  19. centos7.5下gmssl安装使用教程
  20. US Domain Center域名注册| 域名注册商

热门文章

  1. linux centos7 mysql_Linux centos7环境下安装MySQL的步骤详解
  2. eclipse android开发环境搭建_聊聊Spring boot2.X开发环境搭建和基本开发
  3. python要配置几个环境变量_Python环境变量配置
  4. layuiAdmin打开新窗口、新标签页
  5. 【uni-app】uParse 富文本解析插件遇到长图、大图宽高比异常问题
  6. 设计模式(四)--代理模式
  7. linux服务器文件偶尔丢失,【服务器运维】linux抛出找不到文件非常的解决方法...
  8. 剑指offer python 博客园_python-剑指offer16-20
  9. 模型部署到移动端_TensorFlow Lite 自然语言处理模型的最新功能,助力设备端 NLP 部署...
  10. PyTorch教程(八):常见激活函数与Loss的梯度