P2837 晚餐佇列安排

2022-02-17 17:58:01 字數 1362 閱讀 3055

此題可能用動規不太好做,主要是狀態轉移方程很難想個人認為,思維發散的大佬們忽視。

我看了這位大佬的 dp 題解後才想到了方程,在此受我一膜%%%

嗯,說下思路:

先用 a [ i ] 陣列存一下輸入的編號;

然後用二維陣列 dp [ i ][ 0/1 ] 來表示當前第 i 頭奶牛的編號改成 1 或 2 所用的最少次數(0 表示改成 1,1 表示改成 2)

當然要考慮當前第 i 的奶牛的編號是 1 還是 2;

重點來了!!!

如果是 1 ,那麼  dp [ i ][ 0 ] = dp [ i-1 ][ 0 ];dp [ i ][ 1 ] = min ( dp [ i-1 ][ 0 ],dp [ i-1 ][ 1 ] ) + 1;

說一下啥意思:當前第 i 頭奶牛的編號為 1,那麼將這頭奶牛的編號改為 1(其實不用改)的最小次數就是第 i - 1 頭奶牛的編號改成 1 的最小次數,因為你必須保證前面的編號都為   1;

如果將這頭奶牛的編號改成 2(這時候就要改了,所以後面要 +1)的最小次數就是第 i-1 頭奶牛的編號改成 1 或 2 的最小次數,因為編號是 2 不能保證前面的編號是 1 還是 2,所以要求最小值;

同理,如果是 2 那麼 dp [ i ][ 0 ] = dp [ i-1 ][ 0 ] + 1;dp [ i ][ 1 ] = min ( dp [ i-1 ][ 0 ],dp [ i-1 ][ 1 ] );

此時 +1 就挪到了第乙個狀態轉移方程裡,因為 2 改成 1 次數要 +1 是吧。

終於搞完了狀態轉移方程,這個題可以結束了吧?

邊界條件.......

想當然邊界條件就是 dp [ 1 ][ 0 ] 和 dp [ 1 ][ 1 ] 了

所以我們只要來個  dp [ 1 ][ 2 - a [ 1 ] ] = 1;dp [ 1 ][ a [ 1 ] - 1 ] =0;

就能完美的解決 a [ 1 ] = 1 或 2 的賦值情況了qwq

好了,下面上 ac **:

#include#include

#include

#include

using

namespace

std;

int n,a[30001],dp[30001][2]; //

a陣列存放每頭奶牛的編號,dp陣列來求第i頭奶牛改成1或2所用的最少次數

intmain()

if(a[i]==2

)

}cout

<0],dp[n][1]); //

輸出最小值

return0;

}

完結撒花 φ(≧ω≦*)♪

P2837 晚餐佇列安排

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

P2837 晚餐佇列安排

我們先來理解一下題意 奶牛保持乙個混亂的順序站好不動,手裡拿著的牌只有可能是1號或 2 號,農場主很懶 要改它們的牌改成以下三種 111111111 全是第一批 22222222 全是第二批 111112222 前邊是第一批,後邊是第二批 注意不可以是22222111111,因為1,2代表了吃飯的批...

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

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