1.飢餓的奶牛
解題思路:
第一步:排序
按照右端點為第一關鍵字,左端點為第二關鍵字排序。
第二步:預處理陣列p
這裡是關鍵了!眾所周知,dp的各個子結構之間是不能有關聯的。我們的dp是按照區間進行dp,所以對於每乙個區間k,都要計算出p[k]=q,它滿足:
①0≤q②選擇區間k之後,區間1,2,3…q仍然可以選擇
③選擇區間k之後,區間q+1,q+2…k-1不能選擇
我們只需要快速找到乙個區間,使得該區間的右端點在k的左端點左邊即可。
這樣就可以在dp時,快速查詢在執行「選」的決策時轉移的區間。
另外這一步有乙個細節:n的規模大,在尋找區間時需要二分而不能暴力尋找,否則會t掉第三個點。
第三步:dp
方程是非常簡單的(前面的步驟全部都是為了dp)。每個區間只有兩種決策(即選與不選)。
設dp[k]為只考慮前k個區間時最多能選到多少個點。如果選k,轉移到dp[p[k]]+right[k]-left[k]+1;如果不選k,轉移到dp[k-1]。
**:
#include
#include
#define sta a
#define end c
//後來我才知道end是保留字,無奈
using
namespace std;
long
long sta[
150001
],end[
150001
],b,n,p[
150001
],dp[
150001];
bool
cmp1
(int i,
int mid1,
int mid2)
bool
cmp2
(int j,
int mid1,
int mid2)
void
sort
(int l,
int r)}if
(lsort
(l,j);if
(isort
(i,r);}
intbinarysearch
(int l,
int r,
int val)
return l;
}int
main()
for(
int i=
1;i<=b;i++
)dp[i]
=max
(dp[i-1]
,dp[p[i]
]+end[i]
-sta[i]+1
);cout<;return0;
}
總結:
首先這個**不是我寫的,我寫了將近乙個多小時還是沒有乙個很好的方法能通過測試。最後還是看了網上的解題思路。雖然沒寫出來,好好總結一樣的有收穫。
binarysearch()函式:作用是,在區間0到q之間找到最大的乙個j使得end[j]**的難點在我看來不在二分,首先是要想到用動態規劃,其實我感覺對於動態規劃學的比較好的人來說,乙個不難看出來。但是對於我這種小菜雞,還真沒看出來。。。所以到了動態規劃的章節要好好看看。
最後就是在我心裡的重頭戲了,怎麼樣按照右端點為第一關鍵字,左端點為第二關鍵字排序。反正我是不敢想的,能力限制了我的想象。。。。下面就來好好的解釋一下別人是怎麼操作的。
首先是兩個函式comp1和comp2。comp1:相當於是判斷小於。comp2:相當於是判斷大於。這個我硬看了半天沒看明白,後來自己隨便舉了乙個栗子,手動執行了一下就明白了。。。這也算是領悟到了乙個看**的方法。
然後是sort函式,其實它就是乙個就是乙個快速排序。標兵是最中間的那個元素。然後comp1是小於號,comp2是大於號。這樣一看就很好理解了。
這個串**可謂是結合了動態規劃,二分,快速排序為一體,怪不得我寫到自閉。。。。
好了,還準備一天更完所有題目的,看樣子今天只能更一題了。今天有事耽誤了一早上時間。小菜雞六級還沒過,要去學學六級了。
上班第二天
本想坐晚一班車的,誰知道這晚一班的也只是晚了 五 六分鐘,不高興再在站台上等,也只好小跑到車門上去了,果然,八點十分就到了。白天那個困啊 今天的工作內容和昨天一樣,做到後來我實在覺得測的差不多了,想幹些其他的,但這初來乍到的,也不好幹其他的呀,況且領導辦公室就在我旁邊。今天的工作總結有兩點 1 別把...
第二天實習
今天我早早到了銀行,開始給大家抹桌子,算是向愛妃學習吧。之後向wqy學習做表的方法,他很耐心。今天一天也就是做了這麼乙個表,但是還向dh學習了另外一些業務的處理,收穫不小。中午吃了雞腿 肉串和芸豆,好開心啊。我越來越喜歡自己的實習了。今天好多自己班上的同學來面試實習生,希望她們都能上!今天我沒有去同...
實習第二天
又是早起擠地鐵的一天 今天symphony說給我換了個導師,richard。於是我開始自己看,但是我並不清楚背景,不知道整個資料夾是幹什麼目的的,也不知道哪些檔案是需要看的。然後在richard的講解下,我慢慢明白了,終於知道我是幹啥的了,就是完善優化他們寫的自動化測試程式,首先是要看懂他們寫的。按...