題意:
給在一條直線上的n個漢堡店,以及每個漢堡店在x軸上的座標。
求建m個**產,使得每個漢堡店到m個**產的距離和最小。
解析:經典的郵局dp問題。
首先需要知道到達幾個村莊的最小距離和是這幾個村莊的座標中點。
先用乙個遍歷找出所有i j之間的所有最小距離,然後再dp。
狀態轉移方程:
dp[ i ] [ j ] = min ( dp[ i ] [ j ] , dp[ i - 1 ] [ k ] + dis[ k + 1 ] [ j ] )
dp[ i ] [ j ] 表示在j個村莊內,建第i個郵局的最小距離。
dp[ i - 1 ] [ k ] + dis[ k + 1 ] [ j ] 表示得的是在 k + 1 到 j 範圍內再建乙個郵局的總花費。
路徑記錄下的是k的值,即為下一段郵局管轄範圍內的開頭村莊座標值,再知道此段範圍末尾的村莊座標值,就可以算出郵局的地點。
**:
#include #include #include #include #include #include #include #include #include #include #define ll long long
using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 200 + 10;
const int maxm = 30 + 10;
int dp[maxm][maxn];
int path[maxn][maxn];
int dis[maxn][maxn];
int x[maxn];
void print_path(int i, int j)
int main()
for (int i = 1; i <= n; i++)}//
for (int i = 1; i <= n; i++)
for (int i = 2; i <= m; i++)//youju}}
}printf("chain %d\n", ca++);
print_path(m, n);
printf("total distance sum = %d\n\n", dp[m][n]);
}return 0;
}
郵局 dp經典問題
題目 題意 一些村莊被建立在一條筆直的高速公路邊上,我們用一條座標軸來描述這條高速公路,每乙個村莊的座標都是整數,沒 有兩個村莊座標相同。兩個村莊間的距離,定義為它們的座標值差的絕對值。我們需要在一些村莊建立郵局 當然,並不是每 乙個村莊都必須建立郵局,郵局必須被建立在村莊裡,因此它的座標和它所在的...
郵局問題 DP
問題描述 一些村莊建在一條筆直的高速公路邊上,我們用一條座標軸來描述這條公路,每個村莊的座標都是整數,沒有兩個村莊的座標相同。兩個村莊的距離定義為座標之差的絕對值。我們需要在某些村莊建立郵局。使每個村莊使用與它距離最近的郵局,建立郵局的原則是 所有村莊到各自使用的郵局的距離總和最小。輸入格式 第一行...
經典DP問題
動態規劃5個經典問題解析 給定k個整數的序列,其任意連續子串行可表示為,其中 1 i j k。最大連續子串行是所有連續子序中元素和最大的乙個,例如給定序列,其最大連續子串行為,最大和為20。數塔問題 要求從頂層走到底層,若每一步只能走到相鄰的結點,則經過的結點的數字之和最大是多少?include s...