UVA 709 Formatting Text

來源:互聯網
上載者:User

UVA_709

    我們不妨用f[i]表示某行到第i個單詞結束時的最小的badness,這樣f[i]=min{f[i-1]+500,f[j]+badness},當然j+1到i這些單詞必須能在這一行放得下。

    之後我們不妨先考慮下對於一行而言,單詞要怎麼擺才最優。不難證明,各個空白的長度差越小越好,並且長度小的空白排在前面。

    接下來,我們還要保證全文在滿足badness最優的情況下,空白也得最優。如果空白最優,僅就到第i個單詞而言,顯然行數越少越優,在行數相等的情況下,顯然第i個單詞所在的這一行的單詞數越少越優,於是我們再引入一個記錄行數的數組s[]即可。

    題目中提到過如果一行只有一個單詞,僅輸出這個單詞即可,不要在後面補空格,否則會PE。

#include<stdio.h>
#include<string.h>
#include<ctype.h>
#define MAXN 90
#define MAXD 10010
int N, M, f[MAXD], s[MAXD], len[MAXD], p[MAXD], n[3][MAXD];
char b[MAXD], word[MAXD][MAXN];
int init()
{
int i, j, k;
gets(b);
if(b[0] == '0')
return 0;
sscanf(b, "%d", &N);
M = 0;
for(;;)
{
gets(b);
if(b[0] == '\0')
break;
for(i = 0; b[i];)
{
if(b[i] == ' ')
{
i ++;
continue;
}
++ M;
for(j = 0; b[i] != '\0' && b[i] != ' '; i ++, j ++)
word[M][j] = b[i];
word[M][j] = '\0';
len[M] = j;
}
}
return 1;
}
void printpath(int last)
{
int i, j, k, first = p[last];
if(first)
printpath(first);
if(first + 1 == last)
printf("%s", word[last]);
else
{
j = first + 1;
for(i = 0; i < n[0][last]; i ++)
{
printf("%s", word[j ++]);
for(k = 0; k < n[3][last]; k ++)
printf(" ");
}
for(i = 0; i < n[1][last]; i ++)
{
printf("%s", word[j ++]);
for(k = 0; k <= n[3][last]; k ++)
printf(" ");
}
printf("%s", word[j]);
}
printf("\n");
}
void solve()
{
int i, j, k, n1, n2, total, bad;
if(!M)
return;
memset(f, 0x3f, sizeof(f));
memset(s, 0x3f, sizeof(s));
f[0] = s[0] = 0;
for(i = 0; i < M; i ++)
{
if(f[i] + 500 < f[i + 1])
{
f[i + 1] = f[i] + 500;
p[i + 1] = i;
s[i + 1] = s[i] + 1;
}
total = len[i + 1];
for(j = i + 2; j <= M; j ++)
{
total += len[j];
if(total + j - i - 1 > N)
break;
k = (N - total) / (j - i - 1);
n2 = N - total - k * (j - i - 1);
n1 = j - i - 1 - n2;
bad = n1 * (k - 1) * (k - 1) + n2 * k * k;
if(f[i] + bad < f[j] || (f[i] + bad == f[j] && s[i] + 1 <= s[j]))
{
f[j] = f[i] + bad;
p[j] = i;
n[0][j] = n1, n[1][j] = n2, n[3][j] = k;
s[j] = s[i] + 1;
}
}
}
printpath(M);
}
int main()
{
while(init())
{
solve();
printf("\n");
}
return 0;
}


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.