璟雯院

珺璟如晔,雯华若锦

用户工具

站点工具


icpc:problems:luogup1103
problems
名称书本整理
题目编号P1103
题目链接luogu.com.cn/…
来源Luogu
算法分类动态规划, 线性动态规划
难易程度一般般

书本整理

想法

状态需要记录到什么书与删了几本,有些类似于背包动态规划的思路。

f[i][j]为必须有第i本书且前面取了j本书时最小值。

最后答案需要考虑最后几本书也舍去的情况。

代码实现

#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 110;
struct node {
    int x, y;
};
bool cmp(node a, node b) {
    return a.x < b.x;
}
node line[N];
int f[N][N], g[N][N];
int main() {
    int n, k;
    scanf("%d %d", &n, &k);
    for (int i = 1; i <= n; i++)
        scanf("%d %d", &line[i].x, &line[i].y);
    sort(line + 1, line + 1 + n, cmp);
    memset(f, 0x7f, sizeof(f));
    f[0][0] = 0;
    for (int i = 0; i <= n; i++)
        f[i][i - 1] = 0;
    for (int i = 1; i <= n; i++)               // 处理到第i本
        for (int j = 0; j <= min(i, k); j++) { // 拿走j本
            for (int t = j + 1; t >= 1; t--)
                f[i][j] = min(f[i][j], f[i - t][j - t + 1] + abs(line[i].y - line[i - t].y));
        }
    int ans = 0x7f7f7f7f;
    for (int i = 0; i <= k; i++) {
        ans = min(ans, f[n][i]);
        if (n - i > 0)
            ans = min(ans, f[n - i][k - i]);
    }
    printf("%d", ans);
    return 0;
}
/app/www/public/data/pages/icpc/problems/luogup1103.txt · 最后更改: 2024/03/24 07:53 由 温婕莺