link
給定 \(n\) 個學生的口味和忍耐度,若前一道菜的對應的口味是a,這一道為b,則做這道菜所需的時間為 \((a| b)-(a\&b)\),而做第一道菜是不需要計算時間的.
每個學生可以忍耐忍耐度以下的人在他前面插隊買飯
求最小的做飯時間
\(n\le 1000,b_i\le 8\)
令 \(f_\) 表示第 \(i\) 個人前面的狀態是 \(s\) 的最小花費
令 \(f_\) 表示第 \(i\) 個人後面的狀態為 \(s\)
其實狀態有點等效,從前還是從後轉移而已……
但是都不會轉移……所以去抄題解……
設 \(f_\) 為第 \(1\) 到 \(i-1\) 個人已經打完飯,然後第 \(i\) 個人和後面的 \(7\) 個人的打完飯與否的狀態為 \(j\) ,當前打完飯的最後乙個人是 \(k+i\) 的最小時間
不能轉移的都設定成 \(inf\)
分類討論轉移
\(1.\) 不符合狀態的定義
無意義的狀態要避免迴圈,就是 \(f_=inf\)
\(2.\) 轉移狀態
\((1)\) 在 \(st\&1==1\) 時
\[f_=min(f_,f_)
\](這倆狀態一致,所以直接轉移)
\((2)\)
第 \(i\) 個人吃飯,往下轉移(這裡要注意的是否滿足 \(j\&1==0\))
第 \(i\) 個人後面的第幾個人吃飯,這裡還得判斷是不是讓人憤怒了,這裡做個最大可行位置就成的了
判斷是不是第乙個吃飯的時候直接考慮 \(i+k==0\) 就好
#includeusing namespace std;
#define int long long
namespace yspm
const int n=1010;
const int inf=0x3f3f3f3f3f3f3f3f;
int n,b[n],t[n],f[n][256][17];
inline int id(int x)
inline void work()
int rpos=n;
for(int l=0;l<=b[i]&&i+l<=rpos;++l)
{if(j&(1《大概學到了這種加一維控制轉移的題目
其實這題目和「奇怪的道路」確實很類似
P2157 SDOI2009 學校食堂
傳送門 做菜主要是按時間順序,所以可以考慮dp 但是可能後面的人會先打飯 可以發現同學最多只能讓後面的第7個同學先打飯 可以從這裡入手考慮問題 把每8個一起的同學看成乙個狀態 在他們之前的人都已經打好飯了 想象乙個從左往右的佇列 從1 i 1 的同學都打完飯了 然後需要知道的狀態是 i i 7 共8...
P2157 SDOI2009 學校食堂
小f 的學校在城市的乙個偏僻角落,所有學生都只好在學校吃飯。學校有乙個食堂,雖然簡陋,但食堂大廚總能做出讓同學們滿意的菜餚。當然,不同的人口味也不一定相同,但每個人的口味都可以用乙個非負整數表示。由於人手不夠,食堂每次只能為乙個人做菜。做每道菜所需的時間是和前一道菜有關的,若前一道菜的對應的口味是a...
luogu3706 SDOI2017 硬幣遊戲
link 硬幣遊戲 對於100分 我們不難想到這個矩陣過大 且沒有用的節點很多我們最後只要n個節點的答案 其他節點的答案可以不要。考慮把沒用的節點的答案壓到一點上。相同的套路 我們設f i 表示經過第i個點的期望次數 由於是到達某個點我們強制停止 所以概率 結果 期望次數。此時結果為1 0 所以這個...