当前位置: 代码迷 >> 综合 >> Gym 100182H Robot Challenge (DP)
  详细解决方案

Gym 100182H Robot Challenge (DP)

热度:94   发布时间:2023-11-15 13:07:22.0

题目链接:http://codeforces.com/gym/100182/attachments

#include<bits/stdc++.h>
using namespace std;#define debug puts("YES");
#define rep(x,y,z) for(int (x)=(y);(x)<(z);(x)++)
#define ll long long#define lrt int l,int r,int rt
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define root l,r,rt
#define mst(a,b) memset((a),(b),sizeof(a))
#define pii pair<ll,ll>
#define mk(x,y) make_pair(x,y)
const int  maxn =1e3+5;
const int mod=998244353;
const int ub=1e6;
ll powmod(ll x,ll y){ll t; for(t=1;y;y>>=1,x=x*x%mod) if(y&1) t=t*x%mod; return t;}
ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}
/*
题目大意:在二维面上给定若干个
二维点,按序给出,机器人其行走规则是
必须按升序行走二维点,每个点都有个错过该点的罚时,
两个点之间的时间代价就是两点间的距离,
但有个注意点就是:如果在1到2之间要经过3,
那么其系统判定为先到3,然后再到2.题目分析:主要是有个注意点,
如果没有这个点的话就是简单的一个DP,分析下这个注意点,
假设i,j,k三点共线,那么i可以由j和k到达,
考虑k到达时候,要加上j的罚时,少了停留的一秒,
明显是劣质决策,
dp(j)<=dp(k)+dist(j,k)+1
dp(j)+dist(i,j)<=dp(k)+dist(i,j)+dist(j,k)+1<=dp(k)+dist(i,j)+dist(j,k)+V(j)。
所以用二维DP就可以解决。时间复杂度:O(n*n)。
*/
struct node{int x,y,v;}p[maxn];
int sum[maxn],n;
double dp[maxn];
double cmp(int x,int y){return sqrt(1.0*x*x+1.0*y*y);
}
int main(){while(scanf("%d",&n)&&n){rep(i,0,n+5) dp[i]=1.0*mod;dp[0]=0.0,sum[0]=0;p[0]=node{0,0,0};p[n+1]=node{100,100,0};///for(int i=1;i<=n;i++){scanf("%d%d%d",&p[i].x,&p[i].y,&p[i].v);sum[i]=sum[i-1]+p[i].v;}rep(i,1,n+2) rep(j,0,i)dp[i]=min(dp[i],dp[j]+1.0+cmp(p[i].x-p[j].x,p[i].y-p[j].y)+1.0*(sum[i-1]-sum[j]));printf("%.3f\n",dp[n+1]);}return 0;
}