狀壓DP之學校食堂

2022-01-30 13:07:15 字數 1515 閱讀 6588

傳送們

小f 的學校在城市的乙個偏僻角落,所有學生都只好在學校吃飯。學校有乙個食堂,雖然簡陋,但食堂大廚總能做出讓同學們滿意的菜餚。當然,不同的人口味也不一定相同,但每個人的口味都可以用乙個非負整數表示。 由於人手不夠,食堂每次只能為乙個人做菜。做每道菜所需的時間是和前一道菜有關的,若前一道菜的對應的口味是a,這一道為b,則做這道菜所需的時間為(a or b)-(a and b),而做第一道菜是不需要計算時間的。其中,or 和and 表示整數逐位或運算及逐位與運算,c語言中對應的運算子為「|」和「&」。

學生數目相對於這個學校還是比較多的,吃飯做菜往往就會花去不少時間。因此,學校食堂偶爾會不按照大家的排隊順序做菜,以縮短總的進餐時間。

雖然同學們能夠理解學校食堂的這種做法,不過每個同學還是有一定容忍度的。也就是說,隊伍中的第i 個同學,最多允許緊跟他身後的bi 個人先拿到飯菜。一旦在此之後的任意同學比當前同學先拿到飯,當前同學將會十分憤怒。因此,食堂做菜還得照顧到同學們的情緒。 現在,小f 想知道在滿足所有人的容忍度這一前提下,自己的學校食堂做完這些菜最少需要多少時間。

第一行包含乙個正整數c,表示測試點的資料組數。 每組資料的第一行包含乙個正整數n,表示同學數。 每組資料的第二行起共n行,每行包含兩個用空格分隔的非負整數ti和bi,表示按隊伍順序從前往後的每個同學所需的菜的口味和這個同學的忍受度。 每組資料之間沒有多餘空行。

包含c行,每行乙個整數,表示對應資料中食堂完成所有菜所需的最少時間。

2

55 2

4 112 0

3 32 2

25 0

4 0

16

1

設dp[i][j][k]表示第1到第i-1個人已經打到飯,i以及後面7個人的狀態為j,最後乙個打飯的編號為i+k,(k的範圍是-8到7),那麼我們分析轉移

dp[i+1][j>>1][k-1]=min(dp[i+1][j>>1][k-1],dp[i][j][k]);
dp[i][j|(1int t;

const int maxn=1000+10;

const int n=1<<8;

const int inf=0x7f7f7f7f;

int dp[maxn][n][20];

int t[maxn],b[maxn],n;

inline int read()

while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();

return s*w;

}int main()

memset(dp,0x7f,sizeof(dp));//初始化無窮大

dp[1][0][7]=0;//第0個人已經打完,上乙個打飯的人是7-8(不存在)

for(int i=1;i<=n;i++)}}

} }

}} int ans=inf;

for(int k=0;k<=8;k++)

cout<}

}

SDOI2009 學校食堂(狀壓dp)

我擦。有毒吧。好久沒調 調過這麼久了。題目的難點就在於每個人打飯的順序不是一定的 這點特別阻礙思想 注意到乙個人的容忍度最多為7 聯想到狀壓 考慮dp陣列的定義 首先我們可以把乙個人及其後面的7人打沒打飯的狀態壓縮 其次肯定要記錄當前到打飯到哪個人了 即1 i 1都打完了飯 但是似乎少了點啥 對於更...

狀壓DP luogu P2157 學校食堂

小f 的學校在城市的乙個偏僻角落,所有學生都只好在學校吃飯。學校有乙個食堂,雖然簡陋,但食堂大廚總能做出讓同學們滿意的菜餚。當然,不同的人口味也不一定相同,但每個人的口味都可以用乙個非負整數表示。由於人手不夠,食堂每次只能為乙個人做菜。做每道菜所需的時間是和前一道菜有關的,若前一道菜的對應的口味是a...

狀壓dp 洛谷 P2157 學校食堂

小f 的學校在城市的乙個偏僻角落,所有學生都只好在學校吃飯。學校有乙個食堂,雖然簡陋,但食堂大廚總能做出讓同學們滿意的菜餚。當然,不同的人口味也不一定相同,但每個人的口味都可以用乙個非負整數表示。由於人手不夠,食堂每次只能為乙個人做菜。做每道菜所需的時間是和前一道菜有關的,若前一道菜的對應的口味是a...