3027 線段覆蓋 2

2022-05-08 20:39:12 字數 1229 閱讀 6881

題目描述 description

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

n<=1000

輸入描述 input description

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

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

輸出描述 output description

輸出能夠獲得的最大價值

樣例輸入 sample input

1 2 1

2 3 2

1 3 4

樣例輸出 sample output

4資料範圍及提示 data size & hint

資料範圍

對於40%的資料,n≤10;

對於100%的資料,n≤1000;

0<=ai,bi<=1000000

0<=ci<=1000000

分析:序列dp,先按右端點排序,然後判斷後面線段line[i]的左端點是不是》=前面線段line[j]的右端點,是就更新dp[i]=max(dp[i],dp[j]+line[i].c);

最後找出最大的dp就是答案。。

1 #include2 #include

3 #include4 #include5 #include6

using

namespace

std;

7struct

node

8 line[1005

];11

intcmp(node x,node y)

1215

intmain()16·

24 sort(line,line+n,cmp);

25//

for(int i=0; i26

for(int i=0; i)

2734}35

//for(int i=0; i36

//printf("\n");

37int maxs=0;38

for(int i=0; i)

39 maxs=max(maxs,dp[i]);

40 printf("

%d\n

",maxs);

41return0;

42 }

3027 線段覆蓋 2

剛開始我寫這道題目,我的狀態轉移方程式是 dp i i dp i k dp k 1 j 後來才發現 測試資料太大,會導致超時。接著我又重新梳理了解題的思想,直接遍歷一邊可以多選的選項,然後接著用乙個max值儲存最大的價值,題目便ac了 先貼出我錯誤的 include using namespace ...

wikioi 3027 線段覆蓋 2

數軸上有n條線段,線段的兩端都是整數座標,座標範圍在0 1000000,每條線段有乙個價值,請從n條線段中挑出若干條線段,使得這些線段兩兩不覆蓋 端點可以重合 且線段價值之和最大。n 1000 第一行乙個整數n,表示有多少條線段。接下來n行每行三個整數,ai bi ci,分別代表第i條線段的左端點a...

codevs DP 3027線段覆蓋2

題目描述 description 數軸上有n條線段,線段的兩端都是整數座標,座標範圍在0 1000000,每條線段有乙個價值,請從n條線段中挑出若干條線段,使得這些線段兩兩不覆蓋 端點可以重合 且線段價值之和最大。n 1000 輸入描述 input description 第一行乙個整數n,表示有多...