日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

文件排版,较难的线性dp

發布時間:2024/9/5 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 文件排版,较难的线性dp 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文件排版

寫電子郵件是有趣的,但不幸的是經常寫不好看,主要是因為所有的行不一樣長,你的上司想要發排版精美的電子郵件,你的任務是為他編寫一個電子郵件排版程序。
完成這個任務最簡單的辦法是在太短的行中的單詞之間插入空格,但這并不是最好的方法,考慮如下例子:
****************************
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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。