一堆木頭棍子共有n根,每根棍子的長度和寬度都是已知的。棍子可以被一台機器乙個接乙個地加工。機器處理一根棍子之前需要準備時間。準備時間是這樣定義的:
第一根棍子的準備時間為1分鐘;
如果剛處理完長度為l,寬度為w的棍子,那麼如果下乙個棍子長度為li,寬度為wi,並且滿足l>=li,w>=wi,這個棍子就不需要準備時間,否則需要1分鐘的準備時間;
計算處理完n根棍子所需要的最短準備時間。比如,你有5根棍子,長度和寬度分別為(4, 9),(5, 2),(2, 1),(3, 5),(1, 4),最短準備時間為2(按(4, 9)、(3, 5)、(1, 4)、(5, 2)、(2, 1)的次序進行加工)。
第一行是乙個整數n(n<=5000),第2行是2n個整數,分別是l1,w1,l2,w2,…,ln,wn。l和w的值均不超過10000,相鄰兩數之間用空格分開。
僅一行,乙個整數,所需要的最短準備時間。
輸入:549522
1351
4輸出:
2
洛谷題解系列好久沒更新了,今天寫乙個,當然這也是我的附屬部落格中的第一篇題解!
注:附屬部落格點選側邊欄的手機端按鈕即可。
下面正式進入題解部分
先看一下這個題目的標籤:貪心,動態規劃
(誒嘿嘿,我最喜歡貪心了)
這個題目有兩個屬性,長和寬,並且這兩個屬性都是不上公升序列。
我們可以先開乙個結構體儲存長和寬(方便排序)
首次固定乙個屬性,我這裡固定了長,
為什麼要這麼做呢?
你想想哈,一根木棒的長大於另一根木棒,這樣怎麼也是要花錢的,所以,為了保證花最少的錢,就先要把乙個屬性排序。
排序好了,那麼寬怎麼辦嘞?
看題目,逐步求最長不下降子串行即可。
根據dilworth定理可得。
最長不下降子串行的個數等於最長上公升子串行的長度
最長上公升子串行的長度用動態規劃很好解(下週我會發布關於動態規劃演算法的問題解決方法)
好了,問題解決
structffa[
5002
];int
cmp(ff x,ff y)
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++)
1 #include2 #include3 #include4 #include5 #include6#define inf 100000000
7using
namespace
std;
8structff9
a[5002
];12
intcmp(ff x,ff y)
1316
int dp[5002
];17
intmain()
1825 sort(a+1,a+n+1
,cmp);
26for(int i=1;i<=n;i++)
2733
int ans=0;34
for(int i=1;i<=n;i++)
35 ans=max(ans,dp[i]);
36 cout<37return0;
38 }
好了,就到這裡了。
客官,給個贊再走唄?
洛谷 P1233 木棍加工
一堆木頭棍子共有n根,每根棍子的長度和寬度都是已知的。棍子可以被一台機器乙個接乙個地加工。機器處理一根棍子之前需要準備時間。準備時間是這樣定義的 第一根棍子的準備時間為1分鐘 如果剛處理完長度為l,寬度為w的棍子,那麼如果下乙個棍子長度為li,寬度為wi,並且滿足l li,w wi,這個棍子就不需要...
洛谷 P1233 木棍加工
題目鏈結 p1233 木棍加工 解題思路 其實就是求最長上公升子串行 參見diworth定理,序列的不下降子串行最少劃分數等於上公升序列的總長度 以測試資料為例 輸入 5 1018186 1019 1913 208輸出 3可以理解為最後加工的組數為3組,取其中一種情況,比如 10,19 10,18 ...
洛谷 P1233 木棍加工
一堆木頭棍子共有n根,每根棍子的長度和寬度都是已知的。棍子可以被一台機器乙個接乙個地加工。機器處理一根棍子之前需要準備時間。準備時間是這樣定義的 第一根棍子的準備時間為1分鐘 如果剛處理完長度為l,寬度為w的棍子,那麼如果下乙個棍子長度為li,寬度為wi,並且滿足l li,w wi,這個棍子就不需要...