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 由 温婕莺