題目描述
輸出資料範圍限制
題目解法
題目**
一道dp題搞了好久,最後發現根本不難。
john養了若干奶牛,每天晚上奶牛都要進食。由於條件比較簡陋,並不一定所有奶牛都能吃到食物。奶牛的進食方式是這樣的:john有n個食桶(1<=n<=2000),分別編號為1…n。這些食桶被按照編號排成一行。john將奶牛們分成若干組,每組奶牛總是呆在一起進食的,每組奶牛會提出要求——他們需要吃第start到第end桶中的食物。可能存在若干組奶牛都要吃同乙個桶中的食物,從而就產生了衝突,這時john只能滿足其中一組的要求,另一些組就只能餓肚子了。 john當然不想讓奶牛都餓肚子,所以他希望根據奶牛們提出的請求,滿足其中一些組的要求,使得最多的食桶被奶牛食用。這個難題困擾著john,他希望得到你的幫助。
第一行乙個整數n,表示奶牛的組數。(1<=n<=1000) 第2~n+1行,每行兩個整數start和end,描述了一組奶牛提出的請求。
31 3
7 83 4
乙個整數,表示最多有多少個食桶可以被食用。
提示(滿足第1組和第2組奶牛的要求,這樣13號和78號這5個食桶可以被食用)
符合dp所有氣質。
所以開始搞dp,我們先設fif_
fi為當來到第i
ii個桶時,可以食用的桶最大值。
顯然,這樣的解法是要兩層迴圈套排序的。
為什麼要排序呢?
因為我們要找到答案的話,應該是從前的桶考慮到後續的桶,所以我們要按照結束桶end
iend_
endi
排序。
這樣的話,時間複雜度是max
(end
i)n+
nlog
(n
)max(end_)n+nlog(n)
max(en
di)
n+nl
og(n
)的,看到資料範圍,可以過的哈。
考慮轉移式子的意思為,當前最大的值先是為上乙個的最大值,然後尋找乙個結束桶end
xend_
endx
小於當前i
ii的,那麼看這個開始桶的最大值fst
artx
−1
f_-1}
fstart
x−1
加上end
x−st
artx
+1
end_-start_+1
endx−
star
tx+
1。所以轉移式為fi=
max(
fi,f
star
tx−1
+end
x−st
artx
+1
)f_=max(f_,f_-1}+end_-start_+1)
fi=ma
x(fi
,fs
tart
x−1
+en
dx−
star
tx+
1)
#include
using
namespace std;
int p[
10005
],k[
10005];
int n,m=-1
,t;int f[
30005];
intmax
(int a,
int b)
void
qsort
(int l,
int r)}if
(iqsort
(i,r);if
(j>l)
qsort
(l,j);}
intmain()
qsort(1
,n);
for(
int i=
1;i<=m;
++i)
}printf
("%d"
,f[m]);
return0;
}
2013 10 11 飢餓的奶牛
今天這麼有意義的日子不寫點兒什麼浪費了是吧 描述周老師為了讓資訊學奧賽班的學生能更好地投入到備戰資訊學競賽中去,決定自己養若干奶牛,每天早上擠一些牛奶給學生每天喝,補充營養。但餵養奶牛也是一件麻煩事,每天晚上奶牛都要進食。由於條件比較簡陋,並不一定所有奶牛都能吃到食物。奶牛的進食方式是這樣的 周老師...
P1868 飢餓的奶牛
有一條奶牛衝出了圍欄,來到了一處聖地 對於奶牛來說 上面用牛語寫著一段文字。現用漢語翻譯為 有n個區間,每個區間x,y表示提供的x y共y x 1堆優質牧草。你可以選擇任意區間但不能有重複的部分。對於奶牛來說,自然是吃的越多越好,然而奶牛智商有限,現在請你幫助他。輸入格式 第一行,n,如題 接下來n...
NKOJ1066 飢餓的奶牛 DP
問題描述 john養了若干奶牛,每天晚上奶牛都要進食。由於條件比較簡陋,並不一定所有奶牛都能吃到食物。奶牛的進食方式是這樣的 john有m個食桶 1 m 2000 分別編號為1.m。這些食桶被按照編號排成一行。john將奶牛們分成若干組,每組奶牛總是呆在一起進食的,每組奶牛會提出要求 他們需要吃第s...