[bzoj1609]: [Usaco2008 Feb]Eating Together麻煩的聚餐 遞推

題目http://www.lydsy.com/JudgeOnline/problem.php?id=1609

1609: [Usaco2008 Feb]Eating Together麻煩的聚餐
Time Limit: 10 Sec Memory Limit: 64 MB
Submit: 1315 Solved: 792
[Submit][Status][Discuss]
Description

爲了避免餐廳過分擁擠,FJ要求奶牛們分3批就餐。每天晚飯前,奶牛們都會在餐廳前排隊入內,按FJ的設想所有第3批就餐的奶牛排在隊尾,隊伍的前端由設定爲第1批就餐的奶牛佔據,中間的位置就歸第2批就餐的奶牛了。由於奶牛們不理解FJ的安排,晚飯前的排隊成了一個大麻煩。 第i頭奶牛有一張標明她用餐批次D_i(1 <= D_i <= 3)的卡片。雖然所有N(1 <= N <= 30,000)頭奶牛排成了很整齊的隊伍但誰都看得出來,卡片上的號碼是完全雜亂無章的。 在若干次混亂的重新排隊後,FJ找到了一種簡單些的方法:奶牛們不動,他沿着隊伍從頭到尾走一遍把那些他認爲排錯隊的奶牛卡片上的編號改掉,最終得到一個他想要的每個組中的奶牛都站在一起的隊列,例如111222333或者333222111。哦,你也發現了,FJ不反對一條前後顛倒的隊列,那樣他可以讓所有奶牛向後轉,然後按正常順序進入餐廳。 你也曉得,FJ是個很懶的人。他想知道,如果他想達到目的,那麼他最少得改多少頭奶牛卡片上的編號。所有奶牛在FJ改卡片編號的時候,都不會挪位置。

Input

第1行: 1個整數:N 第2..N+1行: 第i+1行是1個整數,爲第i頭奶牛的用餐批次D_i

Output

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

Sample Input

5

1

3

2

1

1

輸入說明:

隊列中共有5頭奶牛,第1頭以及最後2頭奶牛被設定爲第一批用餐,第2頭奶牛的預設是第三批用餐,第3頭則爲第二批用餐。

Sample Output

1

輸出說明:

如果FJ想把當前隊列改成一個不下降序列,他至少要改2頭奶牛的編號,一種可行的方案是:把隊伍中2頭編號不是1的奶牛的編號都改成1。不過,如果FJ選擇把第1頭奶牛的編號改成3就能把奶牛們的隊伍改造成一個合法的不上升序列了。

思路:因爲只有1,2,3,的編號,故修改個數的統計O(n)遞推即可;
記up[i][0\1\2]代表前i頭牛以j編號結尾的最小修改次數;
顯然有up[i][3]=min(up[i-1][1],min(up[i-1][2],up[i-1][3]))+1;
up[i][2]=min(up[i-1][1],up[i-1][2])+1;
up[i][1]=up[i-1][1]+1;
up[i][a[i]]--;

再反着統計一遍;

代碼

#include<iostream>
#include<stdio.h>
using namespace std;
int up[30005][4],down[30005][4];
int a[30005];
int n;

int main()
{
    scanf("%d",&n);
//  for(int i=1;i<=n;i++)

    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        up[i][3]=min(up[i-1][1],min(up[i-1][2],up[i-1][3]))+1;
        up[i][2]=min(up[i-1][1],up[i-1][2])+1;
        up[i][1]=up[i-1][1]+1;
        up[i][a[i]]--;

        down[i][1]=min(down[i-1][1],min(down[i-1][2],down[i-1][3]))+1;
        down[i][2]=min(down[i-1][2],down[i-1][3])+1;
        down[i][3]=down[i-1][3]+1;
        down[i][a[i]]--;

    }
    int ans=up[n][1];
    for(int i=1;i<=3;i++)
    {
        ans=min(ans,min(up[n][i],down[n][i]));
    }
    cout<<ans<<endl;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章