【記憶體限制:$256 mib$】【時間限制:$4000 ms$】
【標準輸入輸出】
【題目型別:傳統】【評測方式:文字比較】
林老師是一位大理石收藏家,他在家裡收藏了$n$塊各種顏色的大理石,第$i$塊大理石的顏色為$a_i$。
但是林老師覺得這些石頭在家裡隨意擺放太過凌亂,他希望把所有顏色相同的石頭放在一起。
換句話說,林老師需要對現有的大理石重新進行排列,在重新排列之後,對於每乙個顏色$j$,如果最左邊的顏色為$j$的大理石是第$l$塊大理石,最右邊的顏色為$j$的大理石是第$r$塊大理石,那麼從第$l$塊大理石到第$r$塊大理石,這些石頭的顏色都為$j$。
由於這些大理石都比較重,林老師無法承受這些大理石的重量太久,所以他每次搬運只能交換相鄰的兩塊大理石。
請問,林老師最少需要進行多少次搬運?
第一行輸入乙個數字$n(2≤n≤4*10^5)$,表示大理石的總數。
第二行輸入$n$個數字$a_1,a_2…,an(1≤a_i≤20)$表示第$i$塊大理石的顏色為$a_i$。
輸出林老師最少需要搬運的次數。
樣例輸入 1734234
22樣例輸入 25
2011410
2樣例輸入 313
5544
3576
5446
樣例輸出 13樣例輸出 20
樣例輸出
321
剛拿到這道題,我就被它的時間限制深深地吸引:$4000ms$?
那麼長的時間限制肯定是暴搜窮竭搜尋演算法啊
於是推出了樣例之後就開始碼搜尋...
打到後面發現自己連搜尋都打不出來,於是這麼乙個偉大的演算法就半路夭折了...
一道幾乎可以說是模板的狀壓dp題。
觀察所有的資料範圍,發現$1≤a_i≤20$,而幾乎是極端的對立,$2≤n≤4*10^5$,可以說對於$a_i$來說$n$是十分大了。
而時間限制又十分巨大:$4000ms$。
那麼這又說明什麼了嗎?
在輸入的資料中,若其中一兩個的範圍十分小,而其他資料又大得不正常
並且時間限制又異常寬鬆
對於時間來說,這道題的常數非常大(或者是某些模擬題)
對於空間來說,若用其他的空間來開陣列是無法承受的
則說明這道題是狀壓dp,而且壓縮的物件就是針對這些比較小的數的
那麼,這道題的狀態?
定義$dp$一維陣列,其中對於$dp_i$,將$i$轉換成二進位制之後,對於其某一位,若這一位為一,說明這個狀態中,第$i$種顏色已經全部被放在一起了
再定義$c$二維陣列,其中$c_$表示在初始狀態中,所有第$j$種顏色的石頭前的第$i$種顏色的石頭的個數
那麼就有狀轉方程$$dp_i=dp_
11#undef cg
12 templateinline t max(const t x,const t y)
13 templateinline t min(const t x,const t y)
14 templateinline t fab(const t x)
15const
int maxn=4e5;
16const
int inf=1ll<<60;17
const
int maxa=25;18
int a[maxn+5
],n,maxx;
19int cnt[maxa+5],c[maxa+5][maxa+5
];20
int dp[(1
<<20)+5
];21
signed main()
28for(int i=0;i<=(1
<1;++i)dp[i]=inf;
29 dp[0]=0;30
for(int i=1;i<=(1
<1;++i)for(int j=0;jif(i&(1
<35 printf("
%lld\n
",dp[(1
<1
]);36
return0;
37 }
週末訓練 大理石
記憶體限制 256 mib 時間限制 4000 ms 標準輸入輸出 題目型別 傳統 評測方式 文字比較 林老師是一位大理石收藏家,他在家裡收藏了 n 塊各種顏色的大理石,第 i 塊大理石的顏色為 a i 但是林老師覺得這些石頭在家裡隨意擺放太過凌亂,他希望把所有顏色相同的石頭放在一起。換句話說,林老...
大理石在哪兒
現有n各大理石,每個大理石上寫著乙個非負整數。首先把各數從小到大排序,然後回答q各問題。每個問題問是否有乙個大理石寫著某個整數x,如果是,還要回答哪個大理石上寫著x。排序後的大理石從左到右編號為1 n。樣例輸入 4 11 3 5 1 55 2 1 3 3 3 1 2 3樣例輸出 case 1 5 f...
大理石在哪兒
問題 現有n個大理石,每個大理石上寫了乙個非負整數 首先把各數從小到大排序 然後回答q個問題。每個問題問是否有乙個大理石寫著某個整數x,如果是,還要回答哪個大理石上寫著x。排序後的大理石從左到右編號為1 n。在樣例中,為了節約篇幅,所有大理石的數合併到一行,所有問題也合併到一行。樣例輸入 412 3...