ZOJ 3537 简单凸包+DP
2016-03-04 20:47
447 查看
/*
简单学习了凸包,基本照着代码抄
凸包好像就是排序后跑一个polygon函数,就能得到一个凸包了
原理的话用平面直角坐标系的斜率理解
*/
简单学习了凸包,基本照着代码抄
凸包好像就是排序后跑一个polygon函数,就能得到一个凸包了
原理的话用平面直角坐标系的斜率理解
凸包之后,图上的点被排序成顺时针排列的点 此时就是区间dp的思路了
*/
#include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <string> #include <algorithm> #include <iostream> using namespace std; #define inf (1000000007) const int MAXN = 300 + 5; struct Point { int x, y; }p[MAXN], sta[MAXN]; bool cmp(Point a, Point b) { if(a.x == b.x) return a.y < b.y; else return a.x < b.x; } int n, mod; int valid(Point a, Point b, Point c) { return (a.y - c.y) * (b.x - c.x) - (b.y - c.y) * (a.x - c.x); } int polygon() { sort(p, p + n, cmp); int cnt = 0; for(int i = 0 ; i < n ; i++){ while(cnt > 1 && valid(sta[cnt], p[i], sta[cnt - 1]) >= 0) cnt--; sta[++cnt] = p[i]; } int temp = cnt; for(int i = n - 2 ; i >= 0 ; i--){ while(cnt > temp && valid(sta[cnt], p[i], sta[cnt - 1]) >= 0) cnt--; sta[++cnt] = p[i]; } return cnt; } int cost[MAXN][MAXN]; int dp[MAXN][MAXN]; int cal(Point a, Point b) {return (abs(a.x + b.x) % mod * abs(a.y + b.y)) % mod;} int main() { while(scanf("%d%d", &n, &mod) != EOF){ for(int i = 0 ; i < n ; i++) scanf("%d%d", &p[i].x, &p[i].y); int tot = polygon(); if(tot <= n) printf("I can't cut.\n"); else{ memset(dp, 0, sizeof(dp)); for(int i = 1 ; i <= n ; i++){ for(int j = i + 2 ; j <= n ; j++) dp[i][j] = dp[j][i] = inf; } memset(cost, 0, sizeof(cost)); for(int i = 1 ; i <= n ; i++){ for(int j = i + 2 ; j <= n ; j++) cost[i][j] = cost[j][i] = cal(sta[i], sta[j]); } for(int i = n ; i >= 1 ; i--){ for(int j = i + 2 ; j <= n ; j++){ for(int k = i + 1 ; k <= j - 1 ; k++) dp[i][j] = min(dp[i][j], dp[i][k] + cost[i][k] + dp[k][j] + cost[k][j]); } } printf("%d\n", dp[1] ); } } return 0; }
相关文章推荐
- Android实现界面左右滑动切换
- 极客学院安卓视频零散笔记总结
- hdu1754 I Hate It(线段树点的更新和区间查找)
- EA使用初步
- typedef的使用1——引入
- 记一道智力题
- Caffe
- hdu 1166 线段树(sum+单点修改)
- Codeforces Round #344 (Div. 2) C题数列的前n个数进行m次升降排序
- hdu 1166 线段树(sum+单点修改)
- HBase源码分析之HRegion上compact流程分析(三)
- Java开源测试工具汇总
- 入门训练-圆的面积
- 算法复杂度的计算方法
- HDU 2476 区间DP
- 解决nginx_1.4+MySql_5.6 中文乱码(问号)问题
- Linux可插拔认证模块(PAM)的配置文件、工作原理与流程
- uva221
- jQuery新手知识
- jquery中mouseout和mouseleave 事件的区别