P1103 書本整理 題解

2022-02-14 15:24:18 字數 1639 閱讀 8223

csdn同步

原題鏈結

簡要題意:

給定 \(n\) 個二元組 \(\\),你的任務首先要將它們按照 \(x\) 排序(保證 \(x\) 兩兩不同),然後從中去掉 \(k\) 個二元組,使得剩下的每相鄰二元組 \(y\) 的差的絕對值之和最小,求這個最小值。

\(n \leq 100 , x,y \leq 200\).

原題中書的高度即為 \(x\),書的寬度即為 \(y\).

首先我們建立結構體 \(\text}\) 來儲存每一本書的情況,便於排序操作。其次我們考慮,類似 \(n \space \text \space k\) 的做法,資料範圍很弱,考慮用動態規劃做。

考慮反其道而行之,去掉 \(k\) 個也就是反選 \(n-k\) 個,換成了熟悉的形式。用 \(f_\) 表示前 \(i\) 本書選 \(j\) 本(必須選第 \(i\) 本)的最優答案。

這樣很容易得到:

\[f_ = \begin

0 \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space \space , l = 1 \\

\min_^i f_ + |a_i . \text - a_j . \text| , l > 1\\

\end\]

第一行是邊界條件,很顯然選 \(1\) 個肯定是 \(0\). 其餘情況列舉從那裡開始選就可以了。

時間複雜度:\(\mathcal(n^3)\).

實際得分:\(100pts\).

// 其實不用開 long long , 特此註明

#pragma gcc optimize(2)

#includeusing namespace std;

typedef long long ll;

const int n=1e2+1;

inline int read()

int x=0; while(ch>='0' && ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar(); return x*f;}

inline void write(int x)

if(x<10)

write(x/10);putchar(char(x%10+'0'));

}struct book a[n]; int n,k;

ll f[n][n];

inline bool cmp(book x,book y)

int main()

題解 P1103 書本整理

一道很好的dp入門題,適合像我這種學了大半年卻還不會dp的人。首先,題目要求我們將書本按照高度排序,在這裡我們可以用結構體實現。其次才是重點,推dp方程。題目中說抽走k本書,我們不妨轉換一下 從n本書中留下 n k 本。然後,尋找每本書之間的關係 對於第一本書,如果留下,花費顯然只能是0。對於第二本...

P1103 書本整理

題意 給出n本書 每本書有高度和寬度,題意讓我們先講高度排序 保證每一本書的高度不同,從大從小排對答案不影響 相鄰的書的寬度差的絕對值為貢獻,讓我們去掉其中k本書,求最小貢獻 思路 去掉書的想法很難實現,我們逆向思維,在其中增加n k本書 那我們設定乙個dp i j 表示第i本書前面的所有書 包括第...

P1103 書本整理

frank是乙個非常喜愛整潔的人。他有一大堆書和乙個書架,想要把書放在書架上。書架可以放下所有的書,所以frank首先將書按高度順序排列在書架上。但是frank發現,由於很多書的寬度不同,所以書看起來還是非常不整齊。於是他決定從中拿掉k本書,使得書架可以看起來整齊一點。書架的不整齊度是這樣定義的 每...