P2943 Usaco2009 Mar 打掃衛生

2021-09-28 07:30:55 字數 1252 閱讀 9816

神題一道

變數異常複雜,請在結合程式及注釋的情況下**。

根據題意不難看出,在選擇的一段區間內,最多有 n

\sqrt

n​種不同的食物。

據此設計dp陣列f[i]表示i時的最小代價。

設計輔助陣列pos[j]表示最多選j種食物時區間左端點位置。

思考:遍歷到i時,使區間食物種數不變應滿足什麼條件?

得出:若上乙個該種食物同樣在此期間內,食物的種數便不必增加。

同理,若乙個食物,其下乙個相同食物在區間外,那麼它就是這個區間內最後乙個該種食物。設計陣列cnt[j]表示從pos[j]到i的食物總數。當 cnt[j]>jcnt[j]>j 時,需彈出一種食物。

方法如上文所述,若當前pos[j]的下乙個同種仍在該區間內,pos[j]便不斷增加,直到現第乙個超越區間的數,然後將其彈掉就可以了。

轉移方程就是 f[i

]=mi

n(f[

pos[

j]−1

]+j∗

j,f[

i]

)f[i]=min(f[pos[j]-1]+j*j,f[i])

f[i]=m

in(f

[pos

[j]−

1]+j

∗j,f

[i])

#include

#include

#include

using

namespace std;

const

int n=

5e4;

int nex[n]

,pos[n]

,pre[n]

,last[n]

,n,m,dp[n]

,cnt[n]

;int

main()

t=sqrt

(n);

//最多可以滿足在乙個區間內有t個不同的食物

for(i=

1;i<=t;i++

) pos[i]=1

;//pos:區間中不同食物小於等於j的最遠位置

for(i=

1;i<=n;i++

) dp[i]

=min

(dp[pos[j]-1

]+j*j,dp[i]);

//統計 }}

printf

("%d"

,dp[n]);

return0;

}

USACO 2009 JAN GOLD 安全路徑

問題描述 gremlins最近在農場上氾濫,它們經常會阻止牛們從農莊 牛棚 1 走到別的牛棚 牛 i的目的地是牛棚 i 每乙個gremlin只認識牛 i並且知道牛 i一般走到牛棚 i的最短路經。所以它們在牛 i到牛棚 i之前的最後一條牛路上等牛 i,當然,牛不願意遇到gremlins,所以準備找一條...

洛谷 P1605 迷宮 USACO

1.problem description 迷宮 問題描述 給定乙個n m方格的迷宮,迷宮裡有t處障礙,障礙處不可通過。給定起點座標和 終點座標,問 每個方格最多經過1次,有多少種從起點座標到終點座標的方案。在迷宮 中移動有上下左右四種方式,每次只能移動乙個方格。資料保證起點上沒有障礙。輸入樣例 輸...

P1209 USACO1 3 修理牛棚

在乙個夜黑風高,下著暴風雨的夜晚,farmer john的牛棚的屋頂 門被吹飛了。好在許多牛正在度假,所以牛棚沒有住滿。牛棚乙個緊挨著另乙個被排成一行,牛就住在裡面過夜。有些牛棚裡有牛,有些沒有。所有的牛棚有相同的寬度。自門遺失以後,farmer john必須盡快在牛棚之前豎立起新的木板。他的新木材...