此題可能用動規不太好做,主要是狀態轉移方程很難想個人認為,思維發散的大佬們忽視。
我看了這位大佬的 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 的卡...