BZOJ1226 SDOI2009 學校食堂

2021-07-10 01:56:23 字數 758 閱讀 3845

題目點這裡

由題目可知,假如第i個人還沒有取,則絕不可能取i+7之後的人,因為第i個人的最大容忍度不會超過7;如果第i個人之前全部取完了,則目前為止最後乙個選的不可能是i-8之前的人,因為i-1不可能先於i-9及之前的人被選。故,可以設計狀態f [i, s, k]表示到第i個人為止,他之前的人都取過了,他及他後面7個人的還沒取過的集合是s,前乙個取的人是k的最優代價。因此可以動態規劃求解。

每次列舉乙個狀態f [i, s, k],如果s中沒有第i個人了,就將f [i, s, k]轉移給f [i+1, s』, k],這裡s』多了第i+8個人。如果s中有第i個人,則列舉s中的乙個符合要求的人j作為k之後所取的那個人,即將狀態f [i, s, k]轉移給f [i, s-, j]。

記錄乙個集合,我們可以採用二進位制壓位得到的整數s表示,若s and 1≠0,則說明第i個人在集合中是存在的,若s and 2≠0,說明第i+1個人在集合中是存在的,依此類推。

而根據第一段的分析,狀態的第三維的值不需要從1到n,只需要記錄乙個對i的相對位置就行,數值從-8到7。

現在,就可以用狀態f [i, s, k]表示到第i個人為止,他之前的人都取過了,他及他後面7個人的狀態是s,前乙個取的人是i+k的最優代價。對於上述兩種轉移,如果s表示的集合中沒有第i個人了,便是將f [i, s, k]轉移給f [i+1, +27, k-1];如果s表示的集合中有第i個人,則列舉其中乙個符合要求的人j作為i+k之後所取的那個人,將狀態轉移給f [i, s-2j-i, j-i]。根據轉移可以知道列舉時第一維必須從小到大列舉,第二維必須從大到小列舉。

bzoj1226學校食堂 SDOI2009

time limit 10 sec memory limit 259 mb submit 931 solved 556 submit status discuss 小f 的學校在城市的乙個偏僻角落,所有學生都只好在學校吃飯。學校有乙個食堂,雖然簡陋,但食堂大廚總能做出讓同學們滿意的菜餚。當然,不同的...

Bzoj 2726 SDOI 任務安排

memory limit 131072kb 64bit io format lld llu description 機器上有n個需要處理的任務,它們構成了乙個序列。這些任務被標號為1到n,因此序列的排列為1,2,3.n。這n個任務被分成若干批,每批包含相鄰的若干任務。從時刻0開始,這些任務被分批加工...

BZOJ 3991 SDOI2015 尋寶遊戲

題目大意 給定一棵樹,其中有若干個關鍵點,任意選擇起點,求從起點出發訪問所有關鍵點又回到起點的最小邊權總和,有m個修改操作,每次修改乙個關鍵點。假如沒有修改操作的話,就像乙個簡單的樹形dp,方程如下 f i sigma sigma.觀察一下dp的過程,就是不斷地從前面的點走到後面的點,所以我們可以不...