[Uva10641]Barisal Stadium(区间dp)
题意:按照顺时针给出操场的周边点,然后给出周围可以建设照明灯的位置,以及在该位置建设照明灯的代价,照明灯照射的范围与操场的边界相切,现在要求一个最小的花费,要求操场的所有边都被照射到。
解题关键:预处理每台灯能够覆盖到的范围,然后对环进行dp即可。对环进行dp的方法是枚举起点,覆盖所有点即可。
注意用叉积的方法处理灯能否照到某条边->某个点。
$dp[i][j]$表示从第$i$个点到第$j$个点之间的边都被照射到的最小代价,只要有某个等得照射范围有覆盖到$i$,$j$,就可以向外扩展。
#include<bits/stdc++.h> #define inf 0x3f3f3f3f using namespace std; typedef long long ll; const double eps=1e-8; const int N=105; const int M=1005; int n,m,dp[N]; bool flag[N]; struct Point{ double x,y; Point(double x=0,double y=0) { this->x=x; this->y=y; }void read(){ scanf("%lf%lf",&x,&y); } }p[N],o;struct node{ int l,r,c; }q[M];bool judge(Point p0, Point p1, Point p2) { return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y)<-eps;//叉积判断是否能被照到 }node tra(Point t, int c){ node ans; ans.c=c;memset(flag,0,sizeof flag); for(int i=0;i<n;i++) if(judge(t,p[i],p[i+1])) flag[i]=true;if (flag[0]&&flag[n-1]){ int l=n-1,r=0;while(flag[l-1]) l--; while(flag[r+1]) r++; ans.l=l,ans.r=r+n;}else{ int l=0,r=n-1; while(!flag[l]) l++;while(!flag[r]) r--;ans.l=l,ans.r=r; }return ans; } bool solve(){ int ans=inf; for(int i=0;i<n;i++){ fill(dp,dp+2*n+1,inf);dp[i]=0;for(int j=0;j<n;j++){int r=i+j; for(int k=0;k<m;k++){if(q[k].l>r) continue;int now=min(i+n,q[k].r+1); dp[now]=min(dp[now],dp[r]+q[k].c); } } ans=min(ans,dp[i+n]);}if(ans==inf) return false;printf("%d\n",ans);return true; } int main(){ while(~scanf("%d",&n)&&n){for(int i=0;i<n;i++) p[i].read(); p[n]=p[0];scanf("%d",&m); Point tmp; int c; for(int i=0;i<m;i++){ tmp.read();scanf("%d",&c); q[i]=tra(tmp,c); }if (!solve()) printf("Impossible.\n"); } return 0; }
转载于:https://www.cnblogs.com/elpsycongroo/p/7808858.html
[Uva10641]Barisal Stadium(区间dp)相关推荐
- POJ 2955 Brackets (区间DP)
题目链接:http://poj.org/problem?id=2955 Brackets Time Limit: 1000MS Memory Limit: 65536K Total Submiss ...
- 0x53. 动态规划 - 区间DP(习题详解 × 8)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 文章目录 0x53. 动态规划 - 区间DP Problem A. 最优矩阵链乘 Problem B. ...
- UVA1626 括号序列 Brackets sequence(区间DP匹配括号,输出匹配方案)
整理的算法模板合集: ACM模板 UVA1626 Brackets sequence 我们将正规括号序列定义如下: 空序列是正规括号序列. 如果 SSS 是一个正规括号序列,那么 (S) 和 [S] ...
- UVA10003 切木棍 Cutting Sticks(区间DP、细节)
整理的算法模板合集: ACM模板 本题其实就是一个区间DP 的模板题,总长度为len,有n个切割点,也就是说能被切割成n+1段,所以左边界是0,有边界是n + 1,所以答案就是f[0][n + 1]. ...
- 【动态规划】区间DP - 最优矩阵链乘(另附POJ1651Multiplication Puzzle)
最优矩阵链乘(动态规划) 一个n∗mn*mn∗m的矩阵由 nnn 行 mmm 列共 n∗mn*mn∗m 排列而成.两个矩阵A和B可以相乘当且仅当A的列数等于B的行数.一个nm的矩阵乘mp的矩阵,运算量 ...
- 【每日DP】day13、P3147 [USACO16OPEN]262144 (区间DP,2048游戏)难度⭐⭐⭐★
P3147 [USACO16OPEN]262144 P 想到合并,自然就想到区间dp,一个被合成的数之前是一个区间,并且由两个数比它小 111 的区间合成.可麻烦的是,我们并不知道之前的两个区间长度各 ...
- poj1651(区间dp)
题目连接:http://poj.org/problem?id=1651 题意:给出一组N个数,每次从中抽出一个数(第一和最后一个不能抽),该次的得分即为抽出的数与相邻两个数的乘积.直到只剩下首尾两个数 ...
- HDU 5115 Dire Wolf ——(区间DP)
比赛的时候以为很难,其实就是一个区间DP= =..思路见:点我. 区间DP一定要记住先枚举区间长度啊= =~!因为区间dp都是由短的区间更新长的区间的,所以先把短的区间更新完.. 代码如下: 1 #i ...
- 编程之美2015资格赛 题目2 : 回文字符序列 [ 区间dp ]
传送门 题目2 : 回文字符序列 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 给定字符串,求它的回文子序列个数.回文子序列反转字符顺序后仍然与原序列相同.例如字符串ab ...
最新文章
- java计算下周一_java – 如何计算下周?
- C++Primer学习——函数
- Linux6.x修改出eth0网卡的解决方法
- arduinowin7_Win7系统下Arduino驱动安装失败的解决方法
- javascript和var之间的区别?
- Apache Hadoop 启动报错:masternode:ssh: connect to host master port 22: Connection timed out 总结
- 详细介绍nagios基本配置
- html5手机端三级联动城市选择代码,省市县三级联动(jQuery手机端收货地址选择地区代码)...
- 计算机桌面有黑边怎么调整,电脑屏幕旁边有黑色框如何恢复_电脑两边黑边怎么还原-win7之家...
- 宝宝三岁多了,整天自言自语,乱说一通怎么办?
- Python容器专题 - 列表(list)
- SNMP学习(2)——SNMP实战
- Python version 3.3 required, which was not found in the registry
- Android持久化技术
- Python将word转化为txt文本
- Java 记录(4) java 生成 UUID ,java.util.UUID 使用
- 我从华为身上学到的项目管理经验 -- 设计篇
- 新版标准日本语高级_第12课
- 跨模态检索 | Visual Representation Learning
- windows11配置检测工具-win11配置检测工具