神題一道
變數異常複雜,請在結合程式及注釋的情況下**。
根據題意不難看出,在選擇的一段區間內,最多有 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必須盡快在牛棚之前豎立起新的木板。他的新木材...