【题目链接】
OpenJudge 2.6 162:Post Office
【题目考点】
1. 动态规划:区间动规
【解题思路】
该题与
信息学奥赛一本通 1197:山区建小学 | OpenJudge 2.6 7624:山区建小学 | 洛谷 P4677 山区建小学
几乎完全相同。
区别仅仅在于:该题输入的是村的位置,而上题输入的是村之间的距离。
山区建小学中需要将村之间的距离通过求前缀和得到村的位置,而本题不需要这一步。
可以参考山区建小学一题的题解来理解并解决本题。
【题解代码】
解法1:区间动规
#include<bits/stdc++.h>
using namespace std;
#define N 305
#define INF 0x3f3f3f3f
int s[N];//s[i]:第i村的位置
int c[N][N];//c[i][j]:第i村到第j村建1所邮局,且都用这个邮局最小距离
int dp[N][N];//dp[i][j]:前i个村建j所邮局,且都用这些邮局的最小距离
int main()
{
int v, p;
cin >> v >> p;
for(int i = 1; i <= v; ++i)
cin >> s[i];
for(int i = 1; i <= v; ++i)
for(int j = i; j <= v; ++j)
c[i][j] = c[i][j-1] + s[j] - s[(i+j)/2];
for(int i = 1; i <= v; ++i)
dp[i][1] = c[1][i];
for(int i = 1; i <= v; ++i)
for(int j = 2; j <= p && j < i; ++j)
{
dp[i][j] = INF;
for(int k = j - 1; k <= i - 1; ++k)
dp[i][j] = min(dp[i][j], dp[k][j-1] + c[k+1][i]);
}
cout << dp[v][p];
return 0;
}