codeforces 30C 概率DP

codeforces 30C


题意:

在 一 场 射 击 游 戏 中 , 有 n 个 点 , 第 i 个 点 的 坐 标 为 ( x i , y i ) , 出 现 的 时 间 为 t i , 射 中 概 率 为 p i 。 在一场射击游戏中,有n个点,第i个点的坐标为(x_i,y_i),出现的时间为t_i,射中概率为p_i。 ni(xi,yi)tipi
1 个 单 位 距 离 需 要 1 秒 时 间 瞄 准 , 问 射 中 点 的 个 数 的 最 大 期 望 。 1个单位距离需要1秒时间瞄准,问射中点的个数的最大期望。 11


题解:

d p [ i ] 表 示 最 后 一 个 射 中 的 是 第 i 个 点 的 最 大 期 望 。 dp[i]表示最后一个射中的是第i个点的最大期望。 dp[i]i

  • d p [ i ] = m a x ( d p [ i ] , d p [ j ] + p [ i ] . p ) dp[i] = max(dp[i], dp[j]+p[i].p) dp[i]=max(dp[i],dp[j]+p[i].p)
  • a n s = m a x ( a n s , d p [ i ] ) ans=max(ans, dp[i]) ans=max(ans,dp[i])

#include 
using namespace std;
typedef long long ll;
const int N = 1001;
double dp[N];

struct node{
    ll x, y, t;
    double p;
    bool operator < (const node &b) const {
        return t < b.t;
    }
}p[N];

int main() {
    int n;
    cin >> n;
    for(int i = 1 ; i <= n ; i++){
        cin >> p[i].x >> p[i].y >> p[i].t >> p[i].p;
    }
    sort(p+1, p+1+n);
    for(int i = 1 ; i <= n ; i++){
        dp[i] = p[i].p;
    }
    double ans = dp[1];
    for(int i = 2 ; i <= n ; i++){
        for(int j = i-1 ; j >= 1 ; j--){
            ll dis = (p[i].x-p[j].x)*(p[i].x-p[j].x)+(p[i].y-p[j].y)*(p[i].y-p[j].y);
            ll able = (p[i].t-p[j].t)*(p[i].t-p[j].t);
            if(able >= dis){
                dp[i] = max(dp[i], dp[j]+p[i].p);
            }
        }
        ans = max(ans, dp[i]);
    }
    cout << setiosflags(ios::fixed) << setprecision(9) << ans << endl;
    return 0;
}

你可能感兴趣的:(概率DP)