APCS202109 第4題美食博覽會

zerojudge題目連結:https://zerojudge.tw/ShowProblem?problemid=g278

在一個美食博覽會上,有 n 個攤位在販售美食,已知每個攤位只會販售一種美食,且他們販售的美食依序是 a1,a2,…,an,其中可能會有某些攤位販售相同種類的美食。

國王及大臣們總共 k 人要依序品嚐所有美食,已知每位品嚐員會選擇一段連續的攤位進行試吃,而每個人都不想要試吃到同一種自己曾經吃過的美食,因此一位品嚐員所選到的範圍不能有同一種美食重複出現。另外,品嚐員們都不喜歡被別人打擾用餐,所以任意兩個品嚐員所選到的連續區間必須是沒有重疊的。

給你 n,k,以及這 n 個攤位分別販售的美食編號,請計算出這些試吃員們總共最多可以吃到幾攤的美食?

輸入說明

第一行輸入兩個正整數 n,k(1≤n≤10^6,1≤k≤20,1≤n×k≤5×10^6),代表有 n 個攤位和 k 個試吃員。 接下來有 n 個數字代表每個攤位各別賣哪一種美食,(1≤ai≤10^5)

輸出說明

輸出k個試吃員總共最多可以吃到幾個攤位


輸入範例

5 1

1 2 1 3 1

10 3

1 7 1 3 1 4 4 2 7 4

輸出範例

3

8


解題策略

DP

參考:https://hackmd.io/@peienwu/APCS0904

s[j],考慮吃第j個攤位,往左邊最遠可以到達的攤位編號,且j到s[j]之間食物也不能重複,與這之間重複食物編號的攤位最大值取較大者

dp[i][j] = max(dp[i][j-1], dp[i-1][s[j]-1]+ j-s[j]+1)


說明:

dp[i][j]:前i個試吃員考慮前j個攤位的最多試吃攤位總數

dp[i][j-1]:不吃第j個攤位

dp[i-1][s[j]-1]:前i-1個試吃員前s[j]-1個攤位的最多攤位總數

j-s[j]+1:第i個試吃員所吃的攤位數