题意:

给出平面上n个点的坐标,选k个点,使得这k个点围起来的面积最大.

分析:

参考了 叉姐的分析 和 不慌不忙菊苣的代码
思路我都懂,但是DP的部分还是不太会写.
我体会了一下其中含义,也许这样可能会好理解一点:
因为求出来的凸包的点数是固定的,所能选的点数也是固定的,那么不选的点的数量也是固定的.
可以反过来考虑:少选一个点,就要损失凸包上的一块面积.
假设\(d(i,j)\)表示考虑了前\(i\)个点,选了\(j\)个点,所损失的最少面积.
第\(i\)个点的前一个点是\(i'\),损失的面积为\(S_{cut}\),那么\(d(i,j)=min(d(i,j),d(i',j-1)+S_{cut})\)

最后答案就是凸包总面积减去最后损失的最小面积.

损失的面积是一小块一小块三角形累加起来的.
上个图片仅供参考:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;typedef long long LL;const int maxn = 100 + 10;struct Point
{LL x, y;Point(LL x = 0, LL y = 0) : x(x), y(y) {}void read() { scanf("%lld%lld", &x, &y); }
};Point operator - (const Point& A, const Point& B) {return Point(A.x - B.x, A.y - B.y);
}bool operator < (const Point& A, const Point& B) {return A.x < B.x || (A.x == B.x && A.y < B.y);
}LL Cross(const Point& A, const Point& B) {return A.x * B.y - A.y * B.x;
}vector<Point> p, con;vector<Point> ConvexHull() {sort(p.begin(), p.end());int n = p.size();vector<Point> ch(n);int m = 0;for(int i = 0; i < n; i++) {while(m > 1 && Cross(ch[m-1]-ch[m-2], p[i]-ch[m-2]) < 0) m--;ch[m++] = p[i];}int k = m;for(int i = n - 2; i >= 0; i--) {while(m > k && Cross(ch[m-1]-ch[m-2], p[i]-ch[m-2]) < 0) m--;ch[m++] = p[i];}if(n > 1) m--;ch.resize(m);return ch;
}int n, k;LL d[maxn][maxn];
bool vis[maxn];int main()
{//freopen("in.txt", "r", stdin);int _; scanf("%d", &_);for(int __ = 1; __ <= _; __++) {scanf("%d%d", &n, &k);p.resize(n);for(int i = 0; i < n; i++) p[i].read();con = ConvexHull();int sz = con.size();if(sz <= 2 || k <= 2) { printf("0\n"); continue; }LL totarea = 0;for(int i = 2; i < sz; i++) totarea += Cross(con[i-1]-con[0], con[i] - con[0]);if(k >= sz) {printf("%lld\n", totarea);continue;}LL ans = 0x3f3f3f3f3f3f3f3f;memset(vis, false, sizeof(vis));int times = min(10 * n / k, sz);while(times--) {int s = rand() % sz;while(vis[s]) s = rand() % sz;vis[s] = true;memset(d, 0x3f, sizeof(d));d[0][0] = 0;for(int i = 1; i <= sz; i++) {int p0 = (s + i) % sz;LL cut = 0;for(int j = i - 1; j >= 0; j--) {int p2 = (s + j) % sz;int p1 = (p2 + i) % sz;cut += Cross(con[p1] - con[p0], con[p2] - con[p0]);for(int l = k; l > 0; l--)d[i][l] = min(d[i][l], d[j][l-1] + cut);}}ans = min(ans, d[sz][k]);}printf("Case #%d: %lld\n", __, totarea - ans);}return 0;
}

转载于:https://www.cnblogs.com/AOQNRMGYXLMV/p/4864442.html

HDU 5473 There was a kingdom 凸包 DP相关推荐

  1. hdu 5473 There was a kingdom(dp+几何)

    题目链接:hdu 5473 There was a kingdom 解题思路 选取的点一定在凸包上,所以对点集做凸包,如果凸包的点个数小于等于K,面积可以取到最大值.否则,枚举起点,做动态规划.dp[ ...

  2. HDU 5473(There was a kingdom-凸包+dp)

    已知n<100n个点取k<nk 个,求这k个点构成凸包的最大面积. 先求出凸包,枚举凸包上第一个点(只要枚举前⌈n/k⌉\lceil n/k \rceil 个点). #include< ...

  3. Codeforces 835 F Roads in the Kingdom(树形dp)

    F. Roads in the Kingdom(树形dp) 题意: 给一张n个点n条边的无向带权图 定义不便利度为所有点对最短距离中的最大值 求出删一条边之后,保证图还连通时不便利度的最小值 $n & ...

  4. hdu 4799 LIKE vs CANDLE(树形dp)

    题目链接:hdu 4799 LIKE vs CANDLE 解题思路 dp[i][0]表示第i个节点不翻转的最优解,dp[i][1]表示翻转的最优解,每个位置翻转的代价到其父亲节点的位置再计算. 代码 ...

  5. HDU 3016 Man Down (线段树+dp)

    HDU 3016 Man Down (线段树+dp) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

  6. HDU - 4856 Tunnels (预处理+状压dp)

    HDU - 4856 Tunnels (预处理+状压dp) [hud链接] [vj链接] 题目 Problem Description Bob is travelling in Xi'an. He f ...

  7. HDU 1025 Constructing Roads In JGShining's Kingdom(DP+二分)

    点我看题目 题意 :两条平行线上分别有两种城市的生存,一条线上是贫穷城市,他们每一座城市都刚好只缺乏一种物资,而另一条线上是富有城市,他们每一座城市刚好只富有一种物资,所以要从富有城市出口到贫穷城市, ...

  8. 【HDU - 1025】Constructing Roads In JGShining's Kingdom(dp最长上升子序列模型 + 二分优化)

    题干: Constructing Roads In JGShining's Kingdom Time Limit: 2000/1000 MS (Java/Others)    Memory Limit ...

  9. hdu 1025 Constructing Roads In JGShining's Kingdom(DP + 二分)

    此博客为转发 Constructing Roads In JGShining's Kingdom Time Limit: 2000/1000 MS (Java/Others)    Memory Li ...

最新文章

  1. RouterOS配置脚本
  2. Matlab如何读取文本文件
  3. python+opencv用电脑调用手机摄像头或其他网路摄像头
  4. 【C language】C语言二分法查找
  5. optee的RPC流程的代码详解
  6. sql 占比计算_数据库索引的优化及SQL处理过程(建议收藏)
  7. C#网络Socket编程
  8. access ea 可以联网吗_EA自家Origin平台高级会员Origin Access Premier现已上线
  9. Java代码块、构造方法(包含继承关系)的执行顺序
  10. 美国十大web2.0公司背后的故事
  11. 微信小程序 转发 分享功能
  12. 小学计算机编程学什么,小学生编程都学什么
  13. 上海市计算机应用基础答案,计算机应用基础10统考(附答案)
  14. JavaScript保姆级教程
  15. 好消息,Vue3官方文档出中文版的啦!
  16. cbnertvirtual内部框架下载_快速开发,支持前后端分离,微服务框架
  17. Hadoop3.2.1 【 YARN 】源码分析 : ApplicationMasterService 源码浅析 [ 一 ]
  18. MySQL的存储引擎InnoDB选择了B+ 树
  19. iOS的三种常见计时器(NStimer、CADisplayLink、dispatch_source_t)的使用
  20. 生物发光及化学发光的原理及其应用

热门文章

  1. sdut 1488 连通分量的个数(并查集)
  2. 从Proxy到Vue3数据绑定
  3. 怎样把做好的css样式改日期,Win8操作系统任务栏中日期样式怎么更改
  4. Nginx 安装配置教程
  5. mysql 获取刚插入行id汇总
  6. 如何用CSS实现图像替换链接文本显示并保证链接可点击
  7. 控件属性、事件持久化
  8. 简单介绍Fedora 8飞信安装及解压
  9. UA MATH567 高维统计专题2 Low-rank矩阵及其估计1 Matrix Completion简介
  10. UA MATH563 概率论的数学基础 中心极限定理14 Kolmogorov maximal inequality