0
点赞
收藏
分享

微信扫一扫

OpenJudge 2.6 162:Post Office

闲鱼不咸_99f1 2022-04-14 阅读 46
动态规划

【题目链接】

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;
}
举报

相关推荐

0 条评论