我們先來理解一下題意:
奶牛保持乙個混亂的順序站好不動,手裡拿著的牌只有可能是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 的卡...