P2837 晚餐佇列安排

2022-04-12 06:54:33 字數 1108 閱讀 8217

我們先來理解一下題意:

奶牛保持乙個混亂的順序站好不動,手裡拿著的牌只有可能是1號或 2 號,農場主很懶 要改它們的牌改成以下三種:

111111111(全是第一批)

22222222(全是第二批)

111112222(前邊是第一批,後邊是第二批)

注意不可以是22222111111,因為1,2代表了吃飯的批次,第一批,第二批  

本蒟蒻一開始曲解題意以為相同數字排在一起就好了

so我們設 f [ i ] [ 1 ] 為奶牛 i 號要把自己改成 1 時農場主需要改的最少號碼數

f [ i ] [ 2 ] 為奶牛 i 號要把自己改成 2 時農場主需要改的最少號碼數

(已經改到了第 i 頭奶牛)

如果此時奶牛 i 是1,那麼它分兩種情況討論:

(1)把自己改成1 它本來就是

所以它就不用改了,此時農場主需要改的號碼數就由 i -1奶牛決定

i 奶牛已經是1了,所以為了前方保持一致,倒推 i - 1奶牛也是 1

轉移方程為:f [ i ] [ 1 ] = f [ i - 1 ] [ 1 ] ; 

(2)把自己改成2

農場主一定要改它,所以一定要+1

那麼第  i - 1 只奶牛可能改為 1 或 2 ,所以要取最小值

轉移方程為:f [ i ] [ 2 ] = min ( f [ i - 1 ] [ 2 ] , f [ i - 1 ] [ 1 ] ) + 1 ;

如果此時奶牛 i 是2,依次類推;

那麼最後比較 f [ n ] [ 1 ] , f [ n ] [ 2 ] ,即把最後乙隻牛改成1 還是2 所需改的次數最少即可

dp**

#include#include

#include

#include

using

namespace

std;

int n,a[30001],f[30001][3

],ans;

intmain()

else

}ans=min(f[n][1],f[n][2

]); printf("%d

",ans);

return0;

}

P2837 晚餐佇列安排

此題可能用動規不太好做,主要是狀態轉移方程很難想個人認為,思維發散的大佬們忽視。我看了這位大佬的 dp 題解後才想到了方程,在此受我一膜 嗯,說下思路 先用 a i 陣列存一下輸入的編號 然後用二維陣列 dp i 0 1 來表示當前第 i 頭奶牛的編號改成 1 或 2 所用的最少次數 0 表示改成 ...

P2837 晚餐佇列安排

p2837 晚餐佇列安排 對程式有新的理解 難度 讀懂題 準確地從題中提取有效資訊 設計演算法 實踐 mmp,我看錯題啦。字首和 列舉斷點即可 1 include2 include3 include4 include5 include6 define inf 2147483647 7 define ...

線性dp 晚餐佇列安排 (洛谷 P2837)

題目描述 為了避免餐廳過分擁擠,fj要求奶牛們分2批就餐。每天晚飯前,奶牛們都會在餐廳前排隊入內,按fj的設想,所有第2批就餐的奶牛排在隊尾,隊伍的前半部分則由設定為第1批就餐的奶牛佔據。由於奶牛們不理解fj的安排,晚飯前的排隊成了乙個 煩。第i頭奶牛有一張標明她用餐批次d i 1 d i 2 的卡...