2010–2011, NEERC, Northern Subregional K.Kitchen Robot【状压Dp】
来源:互联网 发布:360极速浏览器mac版 编辑:程序博客网 时间:2024/05/22 17:51
题目大意:
在一个横向长度为W,纵向长度为L的台子上,机器人在xr,yr处 ,现在有n个物品,散落在平台上,我们机器人每一次只能拿一个物品,然后需要走到台子的边界扔下去,才能继续拿下一个物品。依次类推,问总路径最短,使得所有物品都扔下去。
思路:
观察到物品个数不多,考虑状压dp,设定Dp【i】【j】表示现在已经处理完状态为i的物品,此时到达了j号物品所在位子的最小花费。
那么不难写出其状态转移方程:Dp【q】【k】=min(Dp【q】【k】,Dp【i】【j】+Dis(j,k))这里Dis(j,k)表示的是我们从j位子,将物品扔下去之后,再走到位子k的最小花费,学过高中数学的同学都不难想到,我们从一个点走到另外一个点之前,需要在一个经过一条坐标轴的点的最短距离,就是其中一个点(j/k)将其按照一个平面对称过去之后,和另外一个点相连的距离。四个面都要做一次,求最小花费。
那么过程维护一下即可。
Ac代码:
#include<stdio.h>#include<string.h>#include<math.h>#include<iostream>using namespace std;struct node{ double x,y;} a[25];double r,c;double dp[(1<<20)][20];double dis(int i,int j){ double D1=sqrt((a[i].x-a[j].x)*(a[i].x-a[j].x)+((-a[i].y)-a[j].y)*((-a[i].y)-a[j].y)); double D2=sqrt(((-a[i].x)-a[j].x)*((-a[i].x)-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y)); double D3=sqrt(((c*2-a[i].x)-a[j].x)*((c*2-a[i].x)-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y)); double D4=sqrt((a[i].x-a[j].x)*(a[i].x-a[j].x)+((2*r-a[i].y)-a[j].y)*((2*r-a[i].y)-a[j].y)); double ans=min(min(D1,D2),min(D3,D4)); return ans;}int main(){ freopen("kitchen.in", "r", stdin); freopen("kitchen.out", "w", stdout); while(~scanf("%lf%lf",&c,&r)) { int n; scanf("%d",&n); for(int i=1; i<=n; i++)scanf("%lf%lf",&a[i].x,&a[i].y); scanf("%lf%lf",&a[0].x,&a[0].y); int end=(1<<(1+n)); for(int i=0; i<end; i++) { for(int j=0; j<=n; j++) { dp[i][j]=1000000000000.0; } } dp[1][0]=0; for(int i=0; i<end; i++) { for(int j=0; j<=n; j++) { if((i&(1<<j))!=0) { for(int k=0; k<=n; k++) { if((i&(1<<k))==0) { int q=i+(1<<k); if(i==1) { dp[q][k]=min(dp[q][k],dp[i][j]+sqrt((a[j].x-a[k].x)*(a[j].x-a[k].x)+(a[j].y-a[k].y)*(a[j].y-a[k].y))); } else dp[q][k]=min(dp[q][k],dp[i][j]+dis(j,k)); //printf("%d %d %d %d-->%lf\n",q,k,i,j,dp[q][k]); } } } } } double ans=1000000000000.0; for(int i=1; i<=n; i++) { ans=min(dp[end-1][i]+min(min(a[i].x,c-a[i].x),min(a[i].y,r-a[i].y)),ans); } printf("%.14f\n",ans); }}/*3 421 12 32 1*/
阅读全文
0 0
- 2010–2011, NEERC, Northern Subregional K.Kitchen Robot【状压Dp】
- 2010–2011, NEERC, Northern Subregional训练总结【6/10】
- 2010–2011, NEERC, Northern Subregional C.Commuting Functions【思维】
- SDU省赛选拔-ACM ICPC 2010–2011, NEERC, Northern Subregional Contest
- ACM ICPC 2011–2012, NEERC, Northern Subregional Contest J. John’s Inversions(合并排序求逆序数对数)
- 2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest Problem J 【二分+DP+单调队列】
- BNUOJ 弱校联萌15-16第三次训练赛同步赛 K题 Kitchen Robot [状压DP]
- John’s Inversions 2011-2012 ACM-ICPC, NEERC, Northern Subregional Contest
- Class(ACM ICPC 2008–2009, NEERC, Northern Subregional Contest)
- ACM ICPC 2008–2009, NEERC, Northern Subregional Contest St Petersburg(Gym 100623)
- 20152016-acmicpc-neerc-northern-subregional-contest J:Journey to the "The World's Start"(单调队列+DP+二分)
- 2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest
- 2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest【9/12】
- 2017-2018 ACM-ICPC, NEERC, Northern Subregional Contest
- 2017-2018 ACM-ICPC, NEERC, Northern Subregional Contest
- 2017-2018 ACM-ICPC, NEERC, Northern Subregional Contest
- 【2015-2016 ACM-ICPC, NEERC, Northern Subregional Contest G】【脑洞 拓扑排序 大根堆小根堆极限维护】Graph DAG加k边使得最小拓扑序最大
- NEERC 2010, Eastern subregional contest
- 在Vue中安装mint
- openlayers3+中模拟晨昏线
- 求解约瑟夫问题两种方法
- 使用图表查询(Metric查询)
- windows 下gvim 编码问题和基本设置
- 2010–2011, NEERC, Northern Subregional K.Kitchen Robot【状压Dp】
- 第一章 1.2数据抽象
- HDU
- [My SQL] 插入数据
- js 继承 三种常用方法 原型链-借用构造函数-组合式继承
- Android--保存logcat到文件
- POJ2796 Feel Good【单调栈】
- Python如何安装模块
- php7.1以上版本 mcrypt拓展无法使用导致小程序登录数据无法解密