[usaco] 2008 Dec Largetst Fence 最大的围栏 2 || dp
原网站大概已经上不了了……
题目大意:
求出平面上n个点组成的一个包含顶点数最多的凸多边形。n<=250.
考虑我们每次枚举凸包的左下角为谁(参考Graham求凸包时的左下角),然后像Graham一样,将其他点相对于当前左下角做一个极角排序。
我们会想到一个dp,dp[i][j]表示当前边为i到j的最多点,得到下面这样的转移:
for (int i=1;i<=n;i++)
if (x!=i) dp[x][i]=1;
for (int i=1;i<=n;i++)
for (int j=i+1;j<=n;j++)
for (int k=1;k<i;k++)
if (check(k,i,j)) dp[i][j]=max(dp[i][j],dp[k][i]+1);
//check是检查是否为“凸”
而这样就是n^4了,怎么优化呢?
我们可以记录f[i]为dp[][i]的最大值,这样就省去了枚举k的n,就得到了n^3算法!
因为要省去枚举k的过程,所以check怎么办?
我们预处理每条线段,然后将线段按极角排序即可~
#include<cstdio>
#include<algorithm>
#include<cstring>
#define N 300
using namespace std;
int n,q[N],f[N],dp[N][N],num,ans;
struct hhh
{
int x,y;
hhh() : x(0),y(0) {}
hhh(int _x,int _y) : x(_x),y(_y) {}
hhh operator - (const hhh &b) const
{
return hhh(x-b.x,y-b.y);
}
int operator * (const hhh &b) const
{
return x*b.y-y*b.x;
}
}a[N];
struct hh
{
hhh qwq;
int a,b;
bool operator < (const hh &b) const
{
return qwq*b.qwq<0;
}
}v[N*N];
int read()
{
int ans=0,fu=1;
char j=getchar();
for (;j<'0' || j>'9';j=getchar()) if (j=='-') fu=-1;
for (;j>='0' && j<='9';j=getchar()) ans*=10,ans+=j-'0';
return ans*fu;
}
int check(int x)
{
memset(f,128,sizeof(f));
memset(dp,0,sizeof(dp));
f[x]=0;
int QwQ=0;
for (int i=1;i<=num;i++)
{
dp[v[i].a][v[i].b]=max(dp[v[i].a][v[i].b],f[v[i].a]+1);
if (v[i].b!=x) f[v[i].b]=max(f[v[i].b],f[v[i].a]+1);
}
for (int i=1;i<=n;i++)
QwQ=max(QwQ,dp[i][x]);
return QwQ;
}
int main()
{
freopen("dot.in","r",stdin);
freopen("dot.out","w",stdout);
n=read();
for (int i=1;i<=n;i++) a[i].x=read(),a[i].y=read();
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
if (i!=j)
v[++num].qwq=a[i]-a[j],v[num].a=i,v[num].b=j;
sort(v+1,v+num+1);
for (int i=1;i<=n;i++)
ans=max(ans,check(i));
printf("%d\n",ans);
return 0;
}
[usaco] 2008 Dec Largetst Fence 最大的围栏 2 || dp的更多相关文章
- BZOJ1591 & 洛谷2924:[USACO2008 DEC]Largest Fence 最大的围栏——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1591 https://www.luogu.org/problemnew/show/P2924#sub ...
- BZOJ 1606 USACO 2008 Dec. 购买干草
[题意概述] 有n件物品,每件物品有体积Vi,背包容量为C,问最多可以装多少体积的物品 [题解] 显然是个无限背包嘛.. 直接做背包DP就好 注意无限背包的写法和01背包的区别 #include< ...
- USACO翻译:USACO 2013 DEC Silver三题
USACO 2013 DEC SILVER 一.题目概览 中文题目名称 挤奶调度 农场航线 贝西洗牌 英文题目名称 msched vacation shuffle 可执行文件名 msched vaca ...
- USACO翻译:USACO 2014 DEC Silver三题
USACO 2014 DEC SILVER 一.题目概览 中文题目名称 回程 马拉松 奶牛慢跑 英文题目名称 piggyback marathon cowjog 可执行文件名 piggyback ma ...
- [USACO 2017 Dec Gold] Tutorial
Link: USACO 2017 Dec Gold 传送门 A: 为了保证复杂度明显是从终结点往回退 结果一开始全在想优化建边$dfs$……其实可以不用建边直接$multiset$找可行边跑$bfs$ ...
- NC24083 [USACO 2017 Dec P]Greedy Gift Takers
NC24083 [USACO 2017 Dec P]Greedy Gift Takers 题目 题目描述 Farmer John's nemesis, Farmer Nhoj, has N cows ...
- NC24866 [USACO 2009 Dec S]Music Notes
NC24866 [USACO 2009 Dec S]Music Notes 题目 题目描述 FJ is going to teach his cows how to play a song. The ...
- [Elite 2008 Dec USACO]Jigsaw Puzzles
#include <iostream> #include <cstdio> #include <cstring> using namespace std; #def ...
- 【BZOJ】【1717】【USACO 2006 Dec】Milk Patterns产奶的模式
后缀数组 o(︶︿︶)o 唉傻逼了一下,忘了把后缀数组的字典范围改回20001,直接21交了上去,白白RE了两发……sigh 既然要找出现了K次的子串嘛,那当然要用后缀数组了>_>(因为我 ...
随机推荐
- Android性能优化来龙去脉总结
WeTest 导读 一款app除了要有令人惊叹的功能和令人发指交互之外,在性能上也应该追求丝滑的要求,这样才能更好地提高用户体验. 以下是本人在工作中对经历过的性能优化的一些总结,依据故事的发展路线, ...
- cf#516A. Make a triangle!(三角形)
http://codeforces.com/contest/1064/problem/A 题意:给出三角形的三条边,问要让他组成三角形需要增加多少长度 题解:规律:如果给出的三条边不能组成三角形,那答 ...
- OpenSUSE 11 安装Qt5.0,失败,失败,失败,留个坑,以后来填,万一实现了呢
我又来无耻的写问题来了,这次还真的是没有解决,线留坑吧,万一以后实现了. 同样,这次也是以恶搞网友说听说想在open suse 上面安装5.0版本以后的Qt,自己折腾好几没有成功. 我一想,哎,这不是 ...
- 初学DirectX(1)
初学Direct X (1) Direct3D设备用于访问视频卡的帧缓冲区,以及后台缓冲区.由于IDE是vs2013,默认安装了direct 9,只需要在使用头文件(1)并像使用库文件(2)即可 #i ...
- 前端开发工程师 - 02.JavaScript程序设计 - 期末考试
期末考试客观题 期末考试主观题 https://www.15yan.com/story/aY0HWAQ7oNU/ 1(8分) 函数myType用于根据输入参数返回相应的类型信息. 语法如下: ...
- window.open()与window.showModalDialog区别
window.open()与window.showModalDialog区别 弹出窗口两种方式: 1.window.showModalDialog: var feature = &qu ...
- Twaver的mono-desiner导出的json文件解析
以画的交换机为例,其他大概都差不多. 利用Twaver做出交换机模型如图1所示,其中,每一个端口都是一个单独的对象.具体Twaver操作流程参见网址:http://twaver.servasoft.c ...
- 【树莓派 Raspberry-Pi 】用Windows远程桌面连接树莓派的方法【转】
树莓派DIY笔记之前有介绍过用VNC连接到树莓派的方法.在Windows下,当然还是自带的远程桌面更便捷.如果不想用VNC,利用远程桌面(mstsc.exe)连接树莓派,如何实现? 只需要在raspb ...
- 如果Python对于磁盘没有写入权限,还会运行吗?
Python如果对于磁盘没有写入权限,那么编译成功的字节码文件就只会存储在内存当中,而不会写入到磁盘,每次运行Python都会重新编译,然后运行.
- Agri-Net(最小生成树)
Description Farmer John has been elected mayor of his town! One of his campaign promises was to brin ...