首页 > 代码库 > CodeForces 30C Shooting Gallery 简单dp
CodeForces 30C Shooting Gallery 简单dp
题目链接:点击打开链接
给定n个气球
下面n行 x y t val 表示气球出现的坐标(x,y) 出现的时刻t,气球的价值val
枪每秒移动1个单位的距离
问:
射击的最大价值,开始时枪瞄准的位置任意。
思路:
dp一下。。
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <math.h> #include <set> #include <vector> #include <map> using namespace std; #define ll long long #define N 2005 ll n; struct node{ ll x,y,t; double val; }a[N]; bool cmp(node aa, node bb){ return aa.t<bb.t; } ll dist(node aa, node bb){ return (aa.x-bb.x)*(aa.x-bb.x)+(aa.y-bb.y)*(aa.y-bb.y); } ll dis[N][N]; double dp[N]; int main(){ ll i,j,u,v; while(cin>>n){ for(i = 1; i <= n; i++) cin>>a[i].x>>a[i].y>>a[i].t>>a[i].val; sort(a + 1, a + 1 + n, cmp); for(i = 1; i <= n; i++) { for(j = i+1; j <= n; j++) dis[i][j] = dis[j][i] = dist(a[i],a[j]); } for(i = 1; i <= n; i++) { dp[i] = a[i].val; for(j = 1; j < i; j++) { if(dis[i][j] > ((a[i].t-a[j].t)*(a[i].t-a[j].t))) continue; dp[i] = max(dp[i], dp[j]+a[i].val); } } double ans = 0; for(i = 1; i <= n; i++) ans = max(ans, dp[i]); printf("%.10lf\n",ans); } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。