洛谷P4677 山區建小學

2022-05-20 12:30:14 字數 652 閱讀 1114

題目大意:給定乙個長度為 n 的序列,現選出 m 個點組成乙個集合,求這 n 個點到這個集合的最近距離的和是多少。

題解:狀態設計為 dp[i][j] 表示前 i 個點中選出 j 個點的最近距離和是多少,轉移顯然要列舉上乙個選的點在**,即:\(dp[i][j]=min(dp[k][j-1]+cost(k+1,i))\)。發現在列舉進行計算時,需要提前計算乙個 cost(i,j),表示 [i,j] 這段區間內的點到只有乙個被選點的最近距離是多少。cost 的計算只需預處理即可,每次取區間點的中位數。總時間複雜度為\(o(n^3)\)。

**如下

#include using namespace std;

const int maxn=510;

int n,m,d[maxn],f[maxn][maxn],g[maxn][maxn];

int main()

for(int i=1;i<=n;i++)

for(int j=i;j<=n;j++)

}memset(f,0x3f,sizeof(f));

f[0][0]=0;

for(int i=1;i<=n;i++)}}

printf("%d\n",f[n][m]);

return 0;

}

luogu P4677 山區建小學

傳送門 聽說這題lyh只用了2分鐘就a了,ttql 發現只有乙個學校那麼就是找中位數,多個學校呢?我不知道在 建小學啊,mmp,dp列舉小學範圍的分界點。我是這麼理解的 所以f i j 表示i j建乙個學校的最小花費,就找中位數對吧。然後dp i j 表示前i個村建j個學校的最小花費,轉移方程 dp...

luogu P4677 山區建小學 dp

題目描述 在某山區修建了一條道路,恰好穿越總共nnn個村莊的每個村莊一次,沒有迴路或交叉,任意兩個村莊只能通過這條路來往。已知任意兩個相鄰的村莊之間的距離為did idi 為正整數 其中,0輸出格式 各村莊到最近學校的距離之和的最小值。輸入格式 第1行為n和m,其間用空格間隔。第2行為n 1個整數,...

luogu4677山區建小學題解 區間DP

這道題方法跟之前題不一樣,我們相當於列舉乙個左右端點來線性擴充套件,同時劃分斷點進行決策 f i j 表示在前 i 個村莊中建立 j 個小學的最小距離總和 我們將列舉到第 i 個村莊作為階段,修了 j 所小學作為狀態,通過列舉斷點 k 來分割第 j 所小學與前 j 1 所小學 也就是說我們判斷 f ...