pku2168 Joke with Turtles 區(qū)間DP 注意~
題目大意:
有N只可愛(ài)的小海龜在賽跑。詢問(wèn)每只小海龜它是第幾名,它會(huì)回答你兩個(gè)數(shù),ai,bi,分別表示在它前面的小海龜數(shù)和在它后面的小海龜數(shù)。接著你發(fā)現(xiàn)其中有些小海龜對(duì)你撒了謊,因?yàn)楦鶕?jù)他們的說(shuō)法你根本沒(méi)法給他們排隊(duì)!但是你是善良的,你不希望有很多小海龜在撒謊,想找出最少有哪幾只小海龜在撒謊。(注意:小海龜?shù)拿慰赡苁遣⒘械模。?/span>
分析:
若一只海龜說(shuō)了真話,那么該海龜?shù)奈恢靡欢ㄊ窃趨^(qū)間[ai+1,n-bi] 上。若有k只海龜選擇了相同的區(qū)間 ,則根據(jù)并列關(guān)系,該區(qū)間最多能同時(shí)擁有min{n-ai-bi,k}只海龜(多出來(lái)的海龜肯定是說(shuō)謊的,預(yù)先排除掉)。可以計(jì)算出每個(gè)區(qū)間最多能有多少只海龜,把數(shù)值看做區(qū)間的“權(quán)”。則問(wèn)題轉(zhuǎn)化為,在一些帶權(quán)區(qū)間中,選出權(quán)和最大的區(qū)間,使它們之間不能互相重疊。
算法:
算出每個(gè)出現(xiàn)過(guò)的區(qū)間的“權(quán)”vi ,接下來(lái)的算法就是動(dòng)態(tài)規(guī)劃了。先按右端點(diǎn)坐標(biāo)從小到大排序,令pi 為在區(qū)間 i左邊的且與之無(wú)公共點(diǎn)的最大區(qū)間編號(hào),設(shè)狀態(tài)f[i] 為在前i 個(gè)區(qū)間中可選出區(qū)間的最大權(quán)和,則狀態(tài)轉(zhuǎn)移方程為f(i)=max(f(i-1),f(pi)+vi) ,說(shuō)真話海龜?shù)淖畲髷?shù)量就是最后一個(gè)區(qū)間的f(i) 值。
論文:/Files/yzhw/range.rar
注意,在區(qū)間類問(wèn)題中,要合理設(shè)計(jì)狀態(tài),究竟?fàn)顟B(tài)表示的是前i個(gè)區(qū)間(第i個(gè)區(qū)間不一定?。┻€是第i個(gè)區(qū)間一定要取的前i個(gè)區(qū)間。

2

3

4

5

6

7

8

9

10

11



12

13

14

15

16

17

18

19



20

21

22

23



24

25

26

27

28

29

30

31

32

33



34

35

36

37



38

39

40

41

42

43



44

45

46

47

48

49

50

51



52

53

54

55

56

57

58

59

60

61



62

63

64

65

66

67

68

69

70



71

72



73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

posted on 2010-11-02 02:37 yzhw 閱讀(351) 評(píng)論(0) 編輯 收藏 引用 所屬分類: DP