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

2021-10-01 05:03:58 字數 1345 閱讀 6073

題目描述

為了避免餐廳過分擁擠,fj要求奶牛們分2批就餐。每天晚飯前,奶牛們都會在餐廳前排隊入內,按fj的設想,所有第2批就餐的奶牛排在隊尾,隊伍的前半部分則由設定為第1批就餐的奶牛佔據。由於奶牛們不理解fj的安排,晚飯前的排隊成了乙個**煩。 第i頭奶牛有一張標明她用餐批次d_i(1 <= d_i <= 2)的卡片。雖然所有n頭奶牛排成了很整齊的隊伍,但誰都看得出來,卡片上的號碼是完全雜亂無章的。 在若干次混亂的重新排隊後,fj找到了一種簡單些的方法:奶牛們不動,他沿著隊伍從頭到尾走一遍,把那些他認為排錯隊的奶牛卡片上的編號改掉,最終得到乙個他想要的每個組中的奶牛都站在一起的佇列,例如112222或111122。有的時候,fj會把整個佇列弄得只有1組奶牛(比方說,1111或222)。 你也曉得,fj是個很懶的人。他想知道,如果他想達到目的,那麼他最少得改多少頭奶牛卡片上的編號。所有奶牛在fj改卡片編號的時候,都不會挪位置。

輸入格式

第1行: 1個整數:n * 第2…n+1行: 第i+1行是1個整數,為第i頭奶牛的用餐批次d_i

輸出格式

一行: 輸出1個整數,為fj最少要改幾頭奶牛卡片上的編號,才能讓編號變成他設想中的樣子。

dp[i][j] 表示 i 位置的奶牛 改為 j 編號的最少花費;

可以推的,當 i 位置的奶牛編號為 1 時:

dp[i][0]=dp[i-1][0]; 表示不變

dp[i][1]=min(dp[i-1][0],dp[i-1][1])+1; 表示編號改為 2

當編號為 2 時同理;

**:

#include

#define ll long long

#define pa pair

#define lson k<<1

#define rson k<<1|1

#define inf 0x3f3f3f3f

//ios::sync_with_stdio(false);

using

namespace std;

const

int n=

100100

;const

int m=

4001000

;const ll mod=

998244353

;int d[

30100];

int dp[

30100][

2];int

main()

else

} cout<<

min(dp[n][1

],dp[n][0

])

}

洛谷 P2365 任務安排 (線性dp)

3月14日第二題!題目描述 n個任務排成乙個序列在一台機器上等待完成 順序不得改變 這n個任務被分成若干批,每批包含相鄰的若干任務。從時刻0開始,這些任務被分批加工,第i個任務單獨完成所需的時間是ti。在每批任務開始前,機器需要啟動時間s,而完成這批任務所需的時間是各個任務需要時間的總和 同一批任務...

洛谷 P2365 任務安排 (線性dp)

3月14日第二題!題目描述 n個任務排成乙個序列在一台機器上等待完成 順序不得改變 這n個任務被分成若干批,每批包含相鄰的若干任務。從時刻0開始,這些任務被分批加工,第i個任務單獨完成所需的時間是ti。在每批任務開始前,機器需要啟動時間s,而完成這批任務所需的時間是各個任務需要時間的總和 同一批任務...

洛谷 P2365 任務安排 (線性dp)

3月14日第二題!題目描述 n個任務排成乙個序列在一台機器上等待完成 順序不得改變 這n個任務被分成若干批,每批包含相鄰的若干任務。從時刻0開始,這些任務被分批加工,第i個任務單獨完成所需的時間是ti。在每批任務開始前,機器需要啟動時間s,而完成這批任務所需的時間是各個任務需要時間的總和 同一批任務...