1. 程式人生 > >【基礎練習】【線性DP】codevs3027 線段覆蓋2題解

【基礎練習】【線性DP】codevs3027 線段覆蓋2題解

嚴重 weight 代碼 -c -h scrip trac tput adding

文章被盜還是非常嚴重,加版權信息

轉載請註明出處 [ametake版權全部]http://blog.csdn.net/ametake歡迎來看看


這道題目是線性動歸 可是思想和背包有些類似 事實上線性動歸非常多思想都是背包類似 所以還是依照線性動歸分類

果然寫了2就不想再寫1的DP版本號了= =

題目描寫敘述 Description

數軸上有n條線段,線段的兩端都是整數坐標。坐標範圍在0~1000000,每條線段有一個價值。請從n條線段中挑出若幹條線段,使得這些線段兩兩不覆蓋(端點能夠重合)且線段價值之和最大。

n<=1000

輸入描寫敘述 Input Description

第一行一個整數n,表示有多少條線段。

接下來n行每行三個整數, ai bi ci,分別代表第i條線段的左端點ai。右端點bi(保證左端點<右端點)和價值ci。

輸出描寫敘述 Output Description

輸出可以獲得的最大價值

例子輸入 Sample Input

3

1 2 1

2 3 2

1 3 4

例子輸出 Sample Output

4

數據範圍及提示 Data Size & Hint

數據範圍

對於40%的數據。n10

對於100%的數據,n1000

0<=ai,bi<=1000000

0<=ci<=1000000

題目如上

思想是用結構體存儲左右端點和值 f[i]表示的是選第i條線段所能有的最大值 方程f[i]=max{f[j]}+a[i].c 當中0<j<i且a[j].r<=a[i].l 即除端點外兩線段不重疊 最後掃一遍

註意 f[i]表示的是選第i條線段所能有的最大值 並非前i條線段 私以為假設表示前i條的話可能還要多一維 但沒想到非常好的方法 codevs題解區好像有人用前i條做的 能夠看一下

一次性A真高興

上代碼


——不敢高聲語,恐驚天上人。



【基礎練習】【線性DP】codevs3027 線段覆蓋2題解