日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

CodeVS 1300 文字排版 线性DP

發(fā)布時間:2023/12/10 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CodeVS 1300 文字排版 线性DP 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1300 文件排版
時間限制: 1 s

空間限制: 128000 KB

題目描述 Description

寫電子郵件是有趣的,但不幸的是經(jīng)常寫不好看,主要是因?yàn)樗械男胁灰粯娱L,你的上司想要發(fā)排版精美的電子郵件,你的任務(wù)是為他編寫一個電子郵件排版程序。

完成這個任務(wù)最簡單的辦法是在太短的行中的單詞之間插入空格,但這并不是最好的方法,考慮如下例子:


This is the example you are

actually considering.

假設(shè)我們想將第二行變得和第一行一樣長,靠簡單地插入空格則我們將得到如下結(jié)果:


This is the example you are

actually considering.

但這太難看了,因?yàn)樵诘诙兄杏幸粋€非常大的空白,如果將第一行的單詞“are”移到下一行我們將得到較好的結(jié)果:


This is the example you

are actually considering.

當(dāng)然,這必須對難看程度進(jìn)行量化。因此我們必須給出單詞之間的空格的難看程度,一個包含N個空格符的空白段,其難看程度值為(n-1)2,程序的目的是使難看程度的總和最小化。例如,第一個例子的難看程度是1+7*7=50,而第二個例子的難看程度僅為1+1+1+4+1+4=12。

輸出時,每一行的開頭和結(jié)尾處都必須是一個單詞,即每行開頭和結(jié)尾處不能有空白。唯一例外的是該行僅有一個單詞組成的情況,對于這種情況你可將單詞放在該行開頭處輸出,此時如果該單詞比該行應(yīng)有的長度短則我們指定它的最壞程度為500,當(dāng)然在這種情況下,該行的實(shí)際長度即為該單詞的長度。

輸入描述 Input Description

輸入文件第一行是一個整數(shù)N,表示該段要求達(dá)到的寬度,1<=N<=80。該段文章由一個或多個單詞組成,單詞由ASCII碼值為33到126(包含33和126)的字符組成,單詞與單詞之間用空格隔開(可能超過一個)。單詞長度不會超過段落要求達(dá)到的寬度。一段文字所有單詞的總長度不會超過10000個字符,任何一行都不會超過100個字符,任何一個單詞都在同一行內(nèi)。

輸出描述 Output Description

對于每個段落,找出使其難看程度最小的排版形式并輸出句子:“Minimal badness is B.”,B是指按可能的最好排版形式會發(fā)生的難看程度值。注意排版后文本行數(shù)任意,多余的空格也可刪除。

樣例輸入 Sample Input

28

This is the example you are

actually considering.

樣例輸出 Sample Output

Minimal badness is 12.

分析:
只有通過把空格平均化 越是平均的空格 丑陋值越小
任何一個詞作為結(jié)尾的最少丑陋值是f[i]f[i]f[i]
轉(zhuǎn)移方程為 f[i]=min(f[i],f[j?1]+cost(j,i));f[i] = min(f[i],f[j-1]+cost(j,i));f[i]=min(f[i],f[j?1]+cost(j,i));
cost(j,i)cost(j,i)cost(j,i)為平均化j~i號詞的花費(fèi)

#include<cstdio> #include<cmath> #include<cstring> #include<iostream> #include<algorithm> #include<climits>using namespace std; typedef long long ll; const int maxn = 0x3f3f3f3f; char a[110]; int sum[10010],n; ll dp[10010]; int cost(int i,int j){if(!(i^j)){if(!((sum[i]-sum[j-1])^n))return 0;return 500;}int blank = n-(sum[i]-sum[j-1]);int num = i-j;//分割數(shù)量if(blank<num)return maxn;int avg = blank/num;int y = blank-avg*num;avg--;return num*1LL*(avg)*(avg)+1LL*y*(avg<<1|1); } int main() {int cnt=1;scanf("%d",&n);while(~scanf("%s",a)){sum[cnt] = sum[cnt-1]+strlen(a);cnt++;}for(int i=1;i<=cnt;i++)dp[i] = maxn;for(int i=1;i<=cnt-1;i++){for(int j=1;j<=i;j++){dp[i] = min(dp[i],dp[j-1]+cost(i,j));}}printf("Minimal badness is %lld.\n",dp[cnt-1]);return 0; }

總結(jié)

以上是生活随笔為你收集整理的CodeVS 1300 文字排版 线性DP的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。