print neatly 整齐打印 算法导论
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4098562.html
考虑在一个打印机上整齐地打印一段文章的问题。输入的正文是$n$个长度分别为$L_1,L_2,\dots ,L_n$(以字符个数度量)的单词构成的序列。我们希望将这个段落在一些行上整齐地打印出来,每行至多$M$个字符。“整齐度”的标准如下:如果某一行包含从i到j的单词$(i<j)$,且单词之间只留一个空格,则在行末多余的空格字符个数为 $M - (j-i) - (L_i+ \cdots + L_j)$,它必须是非负值才能让该行容纳这些单词。我们希望所有行(除最后一行)的行末多余空格字符个数的立方和最小。请给出一个动态规划的算法,来在打印机整齐地打印一段又$n$个单词的文章。分析所给算法的执行时间和空间需求。
使用动态规划算法,$dp[i]$表示从第一个单词到第$i$个单词所需要的最小代价。对于每一个单词分别考虑自己单独一行,和前一个单独占据一行$\ldots$ 和前$k$个单词占据一行的情况,其中从$k$到$i$的字符串长度不超过每行最多所能容纳的字符串长度$m$,最后从后向前遍历$dp$数组,计算分别把最后的$k$个单词作为最后一行,且不计算代价的情况下最小的代价。
代码如下:
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <limits.h>
#define MAXN 2010
using namespace std;
typedef long long LL;
LL dp[MAXN], w[MAXN][MAXN];
int len[MAXN];
int n, m;
LL solve()
{
memset(dp, , sizeof(dp));
memset(w, -, sizeof(w));
for( int i = ; i <= n ; i++ )
{
for( int j = ; j <= n ; j++ )
{
w[][j] = ;
}
}
for( int i = ; i <= n ; i++ )
{
for( int j = i ; j <= n ; j++ )
{
int tmp = m - (j-i) - (len[j]-len[i-]);
if( tmp < )
{
break;
}
w[i][j] = tmp*tmp*tmp;
}
}
dp[] = ;
for( int i = ; i <= n ; i++ )
{
dp[i] = dp[i-]+w[i][i];
for( int j = i- ; j >= ; j-- )
{
if( w[j+][i] < ) break;
dp[i] = min(dp[i], dp[j] + w[j+][i]);
}
}
LL res = dp[n];
for( int i = n ; i >= && w[i][n] >= ; i-- )
{
res = min(res, dp[i-]);
}
return res;
}
int main(int argc, char *argv[])
{
while( scanf("%d%d", &n, &m)!=EOF )
{
len[] = ;
for( int i = ; i <= n ; i++ )
{
scanf("%d", &len[i]);
}
for( int i = ; i <= n ; i++ )
{
len[i] = len[i-] + len[i];
}
printf("%lld\n", solve());
}
}
//input:(n, m, arr[i])
//5 5
//4 1 1 3 3
//5 6
//1 3 3 2 3
//output:
//17
//
print neatly 整齐打印 算法导论的更多相关文章
- 堆排序与优先队列——算法导论(7)
1. 预备知识 (1) 基本概念 如图,(二叉)堆是一个数组,它可以被看成一个近似的完全二叉树.树中的每一个结点对应数组中的一个元素.除了最底层外,该树是完全充满的,而且从左向右填充.堆的数组 ...
- [算法导论]二叉查找树的实现 @ Python
<算法导论>第三版的BST(二叉查找树)的实现: class Tree: def __init__(self): self.root = None # Definition for a b ...
- (搬运)《算法导论》习题解答 Chapter 22.1-1(入度和出度)
(搬运)<算法导论>习题解答 Chapter 22.1-1(入度和出度) 思路:遍历邻接列表即可; 伪代码: for u 属于 Vertex for v属于 Adj[u] outdegre ...
- 算法导论学习-Dynamic Programming
转载自:http://blog.csdn.net/speedme/article/details/24231197 1. 什么是动态规划 ------------------------------- ...
- 《算法导论》归并排序----merge-sort
伪代码请见<算法导论>2.3节 merge-sort实现: public class MergeSort { public static void sort(double [ ...
- 《算法导论》插入排序----InsertSort
算法导论,插入排序 public class InsertSort { public static double [] sort(double [] num) { for(int i =1; i< ...
- 算法导论 之 红黑树 - 删除[C语言]【转】
转自:https://blog.csdn.net/qifengzou/article/details/17608863 作者:邹祁峰 邮箱:Qifeng.zou.job@hotmail.com 博客: ...
- [算法导论]quicksort algorithm @ Python
算法导论上面快速排序的实现. 代码: def partition(array, left, right): i = left-1 for j in range(left, right): if arr ...
- 《算法导论》— Chapter 15 动态规划
序 算法导论一书的第四部分-高级设计和分析技术从本章开始讨论,主要分析高效算法的三种重要技术:动态规划.贪心算法以及平摊分析三种. 首先,本章讨论动态规划,它是通过组合子问题的解而解决整个问题的,通常 ...
随机推荐
- DBHelper数据库操作类(二)
不错文章:http://www.codefans.net/articles/562.shtml http://www.cnblogs.com/gaobing/p/3878342.html using ...
- hdu 5443 The Water Problem 线段树
The Water Problem Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php? ...
- php递归无限极分类
递归无限级分类有几种形式,我这里仅仅举例比較经常使用的三种: 第一种:返回有排序的数组: <?php $data = array( 1 => array( 'id' => 1, 'p ...
- Mysql字符集设置 2 图
基本概念 • 字符(Character)是指人类语言中最小的表义符号.例如'A'.'B'等: • 给定一系列字符,对每个字符赋予一个数值,用数值来代表对应的字符,这一数值就是字符的编码(Encodin ...
- 学习笔记之Shell & QSHELL
shell(计算机壳层)_百度百科 http://baike.baidu.com/subview/849/15831672.htm Shell (computing) - Wikipedia, the ...
- 文件和目录之link、unlink、remove和rename函数
任何一个文件可以有多个目录项指向其i节点.创建一个指向现有文件的链接的方法是使用link函数. #include <unistd.h> int link( const char *exis ...
- PAT 1007
1007. Maximum Subsequence Sum (25) Given a sequence of K integers { N1, N2, ..., NK }. A continuous ...
- 不同linux系统添加开机启动程序的命令
see http://phpcj.org/blog/%E4%B8%8D%E5%90%8Clinux%E7%B3%BB%E7%BB%9F%E6%B7%BB%E5%8A%A0%E5%BC%80%E6%9C ...
- USB HID usage table
This usage table lets usbhidctl decode the HID data correctly for the APC RS/XS1000's. This work was ...
- Android 换肤功能的实现(Apk插件方式)
一.概述 由于Android 没有提供一套统一的换肤机制,我猜可能是因为国外更注重功能和体验的原因 所以国内如果要做一个漂亮的换肤方案,需要自己去实现. 目前换肤的方法大概有三种方案: (1)把皮肤资 ...