題目描述 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 #include3 #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,表示有多...