题意:给定n个点的坐标,先问这些点是否能组成一个凸包,如果是凸包,问用不相交的线来切这个凸包使得凸包只由三角形组成,根据costi, j = |xi + xj| * |yi + yj| % p算切线的费用,问最少的切割费用。

链接:点我

题解:点我

2015-07-20:专题复习

代码稍微修改了一下,顺便发现题号写错了

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<algorithm>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<queue>
  7. #include<map>
  8. using namespace std;
  9. #define MOD 1000000007
  10. const int INF=0x3f3f3f3f;
  11. const double eps=1e-;
  12. typedef long long ll;
  13. #define cl(a) memset(a,0,sizeof(a))
  14. #define ts printf("*****\n");
  15. const int MAXN=;
  16. int n,m;
  17. int sgn(double x)
  18. {
  19. if(fabs(x) < eps)return ;
  20. if(x < )return -;
  21. else return ;
  22. }
  23. struct Point
  24. {
  25. int x,y;
  26. Point(){}
  27. Point(double _x,double _y)
  28. {
  29. x = _x;y = _y;
  30. }
  31. Point operator -(const Point &b)const
  32. {
  33. return Point(x - b.x,y - b.y);
  34. }
  35. //叉积
  36. double operator ^(const Point &b)const
  37. {
  38. return x*b.y - y*b.x;
  39. }
  40. //点积
  41. double operator *(const Point &b)const
  42. {
  43. return x*b.x + y*b.y;
  44. }
  45. //绕原点旋转角度B(弧度值),后x,y的变化
  46. };
  47. Point list[MAXN];
  48. int Stack[MAXN],top;
  49. double dist(Point a,Point b)
  50. {
  51. return sqrt((a-b)*(a-b));
  52. }
  53. //相对于list[0]的极角排序
  54. bool _cmp(Point p1,Point p2)
  55. {
  56. double tmp=(p1-list[])^(p2-list[]);
  57. if(sgn(tmp)>)return true;
  58. else if(sgn(tmp)== && sgn(dist(p1,list[]) - dist(p2,list[])) <= )
  59. return true;
  60. else return false;
  61. }
  62. void Graham(int n)
  63. {
  64. Point p0;
  65. int k=;
  66. p0=list[];
  67. //找最下边的一个点
  68. for(int i=;i < n;i++)
  69. {
  70. if( (p0.y>list[i].y) || (p0.y==list[i].y && p0.x>list[i].x) )
  71. {
  72. p0=list[i];
  73. k=i;
  74. }
  75. }
  76. swap(list[k],list[]);
  77. sort(list+,list+n,_cmp);
  78. if(n==)
  79. {
  80. top=;
  81. Stack[]=;
  82. return;
  83. }
  84. if(n==)
  85. {
  86. top=;
  87. Stack[]=;
  88. Stack[]=;
  89. return ;
  90. }
  91. Stack[]=;
  92. Stack[]=;
  93. top=;
  94. for(int i=;i < n;i++)
  95. {
  96. while(top> && sgn((list[Stack[top-]]-list[Stack[top-]])^(list[i]-list[Stack[top-]])) <= )
  97. top--;
  98. Stack[top++]=i;
  99. }
  100. }
  101. int cost[MAXN][MAXN];
  102. int dis(Point p1,Point p2)//计算题目定义的cost
  103. {
  104. return abs(p1.x+p2.x)*abs(p1.y+p2.y)%m;
  105. }
  106. int dp[MAXN][MAXN];
  107. int main()
  108. {
  109. int i,j,k;
  110. #ifndef ONLINE_JUDGE
  111. freopen("1.in","r",stdin);
  112. #endif
  113. while(~scanf("%d%d",&n,&m))
  114. {
  115. for(i=;i<n;i++)
  116. {
  117. scanf("%d%d",&list[i].x,&list[i].y);
  118. }
  119. Graham(n);
  120. if(top!=n)
  121. {
  122. puts("I can't cut.");
  123. continue;
  124. }
  125. cl(cost);
  126. for(i=;i<n;i++)
  127. for(j=i+;j<n;j++)
  128. cost[i][j]=cost[j][i]=dis(list[i],list[j]);
  129. for(i=;i<n;i++)
  130. {
  131. for(j=i;j<n;j++)dp[i][j]=INF;
  132. dp[i][(i+)%n]=;
  133. }
  134. for(int len=;len<n;len++)
  135. {
  136. for(i=;i+len<=n-;i++)
  137. {
  138. j=i+len;
  139. for(k=i+;k<=j-;k++)
  140. {
  141. dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]+cost[i][k]+cost[k][j]);
  142. }
  143. }
  144. }
  145. /*for(i=n-3;i>=0;i--)
  146. {
  147. for(j=i+2;j<n;j++)
  148. {
  149. for(k=i+1;k<=j-1;k++)
  150. {
  151. dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]+cost[i][k]+cost[k][j]);
  152. }
  153. }
  154. }*/
  155. printf("%d\n",dp[][n-]);
  156. }
  157. }
  1. #include<cstdio>
  2. #include<iostream>
  3. #include<algorithm>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<queue>
  7. #include<map>
  8. using namespace std;
  9. #define MOD 1000000007
  10. const int INF=0x3f3f3f3f;
  11. const double eps=1e-;
  12. typedef long long ll;
  13. #define cl(a) memset(a,0,sizeof(a))
  14. #define ts printf("*****\n");
  15. const int MAXN=;
  16. int n,m;
  17. int sgn(double x)
  18. {
  19. if(fabs(x) < eps)return ;
  20. if(x < )return -;
  21. else return ;
  22. }
  23. struct Point
  24. {
  25. int x,y;
  26. Point(){}
  27. Point(double _x,double _y)
  28. {
  29. x = _x;y = _y;
  30. }
  31. Point operator -(const Point &b)const
  32. {
  33. return Point(x - b.x,y - b.y);
  34. }
  35. //叉积
  36. double operator ^(const Point &b)const
  37. {
  38. return x*b.y - y*b.x;
  39. }
  40. //点积
  41. double operator *(const Point &b)const
  42. {
  43. return x*b.x + y*b.y;
  44. }
  45. //绕原点旋转角度B(弧度值),后x,y的变化
  46. };
  47. Point list[MAXN];
  48. int Stack[MAXN],top;
  49. double dist(Point a,Point b)
  50. {
  51. return sqrt((a-b)*(a-b));
  52. }
  53. //相对于list[0]的极角排序
  54. bool _cmp(Point p1,Point p2)
  55. {
  56. double tmp=(p1-list[])^(p2-list[]);
  57. if(sgn(tmp)>)return true;
  58. else if(sgn(tmp)== && sgn(dist(p1,list[]) - dist(p2,list[])) <= )
  59. return true;
  60. else return false;
  61. }
  62. void Graham(int n)
  63. {
  64. Point p0;
  65. int k=;
  66. p0=list[];
  67. //找最下边的一个点
  68. for(int i=;i < n;i++)
  69. {
  70. if( (p0.y>list[i].y) || (p0.y==list[i].y && p0.x>list[i].x) )
  71. {
  72. p0=list[i];
  73. k=i;
  74. }
  75. }
  76. swap(list[k],list[]);
  77. sort(list+,list+n,_cmp);
  78. if(n==)
  79. {
  80. top=;
  81. Stack[]=;
  82. return;
  83. }
  84. if(n==)
  85. {
  86. top=;
  87. Stack[]=;
  88. Stack[]=;
  89. return ;
  90. }
  91. Stack[]=;
  92. Stack[]=;
  93. top=;
  94. for(int i=;i < n;i++)
  95. {
  96. while(top> && sgn((list[Stack[top-]]-list[Stack[top-]])^(list[i]-list[Stack[top-]])) <= )
  97. top--;
  98. Stack[top++]=i;
  99. }
  100. }
  101. int cost[MAXN][MAXN];
  102. int dis(Point p1,Point p2)//计算题目定义的cost
  103. {
  104. return abs(p1.x+p2.x)*abs(p1.y+p2.y)%m;
  105. }
  106. int dp[MAXN][MAXN];
  107. int main()
  108. {
  109. int i,j,k;
  110. #ifndef ONLINE_JUDGE
  111. freopen("1.in","r",stdin);
  112. #endif
  113. while(~scanf("%d%d",&n,&m))
  114. {
  115. for(i=;i<n;i++)
  116. {
  117. scanf("%d%d",&list[i].x,&list[i].y);
  118. }
  119. Graham(n);
  120. if(top!=n)
  121. {
  122. puts("I can't cut.");
  123. continue;
  124. }
  125. cl(cost);
  126. for(i=;i<n;i++)
  127. for(j=i+;j<n;j++)
  128. cost[i][j]=cost[j][i]=dis(list[i],list[j]);
  129. for(i=;i<n;i++)
  130. {
  131. for(j=i;j<n;j++)dp[i][j]=INF;
  132. dp[i][(i+)%n]=;
  133. }
  134. for(i=n-;i>=;i--)
  135. {
  136. for(j=i+;j<n;j++)
  137. {
  138. for(k=i+;k<=j-;k++)
  139. {
  140. dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]+cost[i][k]+cost[k][j]);
  141. }
  142. }
  143. }
  144. printf("%d\n",dp[][n-]);
  145. }
  146. }

zoj 3537 区间dp+计算几何的更多相关文章

  1. zoj 3469 区间dp **

    题意:有一家快餐店送外卖,现在同时有n个家庭打进电话订购,送货员得以V-1的速度一家一家的运送,但是每一个家庭都有一个不开心的值,每分钟都会增加一倍,值达到一定程度,该家庭将不会再订购外卖了,现在为了 ...

  2. UVA-1331 Minimax Triangulation 区间dp 计算几何 三角剖分 最大三角形最小化

    题目链接:https://cn.vjudge.net/problem/UVA-1331 题意 给一个任意多边形,把它分为多个三角形. 求某方案中最大的三角形是各方案中最小的面积的三角形面积. 思路 学 ...

  3. UVa 1331 - Minimax Triangulation(区间DP + 计算几何)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  4. ZOJ 3469 区间DP Food Delivery

    题解 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm ...

  5. zoj 3537 Cake 区间DP (好题)

    题意:切一个凸边行,如果不是凸包直接输出.然后输出最小代价的切割费用,把凸包都切割成三角形. 先判断是否是凸包,然后用三角形优化. dp[i][j]=min(dp[i][j],dp[i][k]+dp[ ...

  6. ZOJ 3537 Cake(凸包+区间DP)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3537 题目大意:给出一些点表示多边形顶点的位置,如果不是凸多边形 ...

  7. ZOJ 3537 Cake(凸包判定+区间DP)

    Cake Time Limit: 1 Second Memory Limit: 32768 KB You want to hold a party. Here's a polygon-shaped c ...

  8. ZOJ 3537 Cake 求凸包 区间DP

    题意:给出一些点表示多边形顶点的位置(如果多边形是凹多边形就不能切),切多边形时每次只能在顶点和顶点间切,每切一次都有相应的代价.现在已经给出计算代价的公式,问把多边形切成最多个不相交三角形的最小代价 ...

  9. [ZOJ]3541 Last Puzzle (区间DP)

    ZOJ 3541 题目大意:有n个按钮,第i个按钮在按下ti 时间后回自动弹起,每个开关的位置是di,问什么策略按开关可以使所有的开关同时处于按下状态 Description There is one ...

随机推荐

  1. PHP验证注册信息

    注册页面reg.html <form action="reg.php" method="post"> 用户名<input type=" ...

  2. 将python脚本转换成exe文件--pyinstaller

    遇到的大坑: 直接运行python文件效果:         执行 pyinstaller  -F -w  -p  -i ./123.ico  ./main.py    在dict文件夹下生成exe文 ...

  3. 1.SpringBoot之Helloword 快速搭建一个web项目

    背景: Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配 ...

  4. invalid byte sequence for encoding "UTF8": 0xe99d2c

    服务器还原数据库数据出错,老规矩... 字符集编码的问题 http://blog.csdn.net/beiigang/article/details/39582583 over....

  5. nio复习总结

    观察者: 多个对象依赖一个对象的状态, 当这个对象状态发生改变时,依次通知多个对象. 消息的分发和处理 事件驱动 / IO多路复用 借助select  epoll等 reactor: io事件触发时, ...

  6. [java笔记]动态数组

    private int count;//计数器 private int ary[] = new int [3]; if(count >= ary.length){ //数组动态扩展 int ne ...

  7. sql中多层循环示例(有游标)

    在需求处理中,我们会遇到需要通过SQL多层循环来处理的问题.如:A表中有8条数据,B表中有10条数据,需要实现A表中的每1条数据对应B表中的10条数据,最后就有了80条数据,从而实现一对多的关系.那如 ...

  8. OA项目CRUD和单元测试(一)

    使用ModeFirst方法生成数据库,EntityFramework5.0. 一:Model层的模型:(根据模型生成数据库) 二:Dal层的UserInfo代码: namespace SunOA.EF ...

  9. git/github 生成密钥

    当从本地提交文件到github的时候,提交不成功,报错,可能问题就是你还没有生成ssh秘钥 github要使用ssh密钥的原因: git使用https协议,每次pull, push都要输入密码,相当的 ...

  10. VS 2015 序列号/密钥/企业版/专业版

    专业版:HMGNV-WCYXV-X7G9W-YCX63-B98R2企业版:HM6NR-QXX7C-DFW2Y-8B82K-WTYJV