poj1093
题意:给出一个句子和要求整理后每行包含的字符数,要求将其整理为一种总badness最小的形式。设每个空格长度为n,单个空格的badness计算公式为(n-1)^2。总badness等于所有空格的badness的总和。给出整理后的格式。在badness最小的前提下,在分配一行中的空格时要让前面的空格尽量少。如果一个单词单占一行,badness为500。
分析:动态规划。f[i]表示前i个单词的最小badness是多少。f[i]=f[i-j]+cost(i-j,j);。cost(a,b)表示从单词a+1到单词b的放在一行中最小badness是多少。
并用from[i]存储f[i]是从哪个位置计算得来的值,即最后一次更新f[i]时i-j是几,即f[i]所在行的上一行的最后一个单词是第几个。
我们利用from数组可以求出最佳方案,然后按照题中要求输出即可。
- #include <iostream>
- #include <cstdio>
- #include <cstdlib>
- #include <cstring>
- using namespace std;
- const int maxn = ;
- int n, wordsnum;
- string words[maxn];
- int sum[maxn];
- int f[maxn][maxn];
- int from[maxn][maxn];
- void turntowords(string st)
- {
- int i = ;
- while ()
- {
- i = ;
- while (st[i] != ' ' && i < signed(st.length()))
- i++;
- words[wordsnum++] = st.substr(, i);
- sum[wordsnum] = i + sum[wordsnum - ];
- if (i == signed(st.length()))
- break;
- st.erase(, i);
- while (st[] == ' ')
- st.erase(, );
- }
- }
- void init()
- {
- string st;
- wordsnum = ;
- memset(sum, , sizeof(sum));
- getchar();
- while ()
- {
- getline(cin, st);
- if (st == "")
- break;
- turntowords(st);
- }
- }
- int cost(int start, int end)
- {
- int left, right, tot, len;
- if (end - start == )
- return ;
- tot = n - (sum[end] - sum[start]);
- len = tot / (end - start - );
- left = end - start - - tot % (end - start - );
- right = tot % (end - start - );
- return left * (len - ) * (len - ) + right * len * len;
- }
- void work()
- {
- int i, j, k;
- memset(f, -, sizeof(f));
- f[][] = ;
- for (i = ; i <= wordsnum; i++)
- for (j = ; j <= wordsnum; j++)
- for (k = ; k <= j && j - k >= i - && n - (sum[j] - sum[j - k]) >= k - ; k++)
- if (f[i - ][j - k] != - && (f[i][j] > f[i - ][j - k] + cost(j - k, j) || f[i][j] == -))
- {
- f[i][j] = f[i - ][j - k] + cost(j - k, j);
- from[i][j] = k;
- }
- }
- void printline(int start, int end)
- {
- int left, tot, len, i, j;
- if (end - start == )
- {
- cout << words[start] << endl;
- return;
- }
- tot = n - (sum[end] - sum[start]);
- len = tot / (end - start - );
- left = end - start - - tot % (end - start - );
- for (i = start; i < end - ; i++)
- {
- cout << words[i];
- for (j = ; j < len; j++)
- printf(" ");
- if (i - start + > left)
- printf(" ");
- }
- cout << words[end - ] << endl;
- }
- void output()
- {
- int i, best = , besti;
- for (i = ; i <= wordsnum; i++)
- if (f[i][wordsnum] < best && f[i][wordsnum] >= )
- {
- best = f[i][wordsnum];
- besti = i;
- }
- int line[maxn];
- int j = wordsnum;
- for (i = besti; i > ; i--)
- {
- line[i] = from[i][j];
- j -= from[i][j];
- }
- j = ;
- for (i = ; i <= besti; i++)
- {
- printline(j, j + line[i]);
- j += line[i];
- }
- cout << endl;
- }
- int main()
- {
- //freopen("D:\\t.txt", "r", stdin);
- while (cin >> n && n != )
- {
- init();
- work();
- output();
- }
- return ;
- }
poj1093的更多相关文章
- DP50题(转)
转自https://www.luogu.org/blog/cccx2016/dp50-ti-ti-hao dp50题: poj1014 poj1015 poj1018 poj1036 poj1038 ...
随机推荐
- HDU 2028 Lowest Common Multiple Plus
http://acm.hdu.edu.cn/showproblem.php?pid=2028 Problem Description 求n个数的最小公倍数. Input 输入包含多个测试实例,每个 ...
- VSCODE 使用gitlab 推送代码的简单总结
1. 前提条件: 有一个gitlab 服务器 自己的windows机器上面已经形成了 ssh key 以及进行了 gitlab global config 的配置 能够正常联系gitlab数据库 2. ...
- day5——Java 实现导出excel表 POI(转)
1.首先下载poi-3.6-20091214.jar,下载地址如下: http://download.csdn.net/detail/evangel_z/3895051 2.Student.java ...
- DELPHI动态创建窗体
//第一种方式 procedure TForm1.btn1Click(Sender: TObject); begin With TForm2.Create(Application) do Try Sh ...
- python自动化之调试
#####调试 #####查看日志与断言 ''' 抛出异常使用raise语句.在代码中,raise语句包含以下部分: (1)raise关键字; (2)对Exception函数的调用; (3)传递给Ex ...
- 想转C++了
暑假想学一学C++ 早退役了高考后才转C++的oier——我真是太蒻了
- 函数、可变参数、keyword-only参数、实参解构
函数的数学定义:y=f(x) ,y是x的函数,x是自变量.y=f(x0, x1, ..., xn) python中的函数: 由函数名称.参数列表.和若干语句组成的语句块构成,完成一定的功能,是组织代码 ...
- Redis的持久化数据
Redis支持两种持久化:RDB和AOF模式 一.名词解释: RDB:持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot).AOF:持久化记录服务器执行的 ...
- Access与SQL Server 语法差异
序号 简述 Access语法 SqlServer语法 Oracle语法 解决方案 01 系统时间 Now(),Date() GETDATE() SYSDATE GetSysTimeStr 02 连接字 ...
- 使用 EXISTS 代替 IN 和 inner join
在使用Exists时,如果能正确使用,有时会提高查询速度: 1,使用Exists代替inner join 2,使用Exists代替 in 1,使用Exists代替inner join例子: 在一般写s ...