Sky Soldiers

Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 559    Accepted Submission(s): 181

Problem Description
An airplane carried k soldiers with parachute is plan to let these soldiers jump off the plane along a straight air route. The landing point of these soldiers is undetermined because of various weather conditions. However, the statisticians
of the army can analysis the probability of landing in a certain place through landing history records. To make it simple, the statistician suggests that these sky soldiers will land on finite discrete points of a straight line.



This mission plans to place m provisions for the soldiers on the line for landing. These soldiers will be informed the direction of the nearest provision point by a special device after landing, and then walk to the point. The manager of this mission is asking
you for help: to determine m points for provisions so that the expected sum of walking distance should be minimized. You can put provisions on any point of the landing line.
 
Input
There are multiple test cases. For each case, the first line contains two integers k and m (1 ≤ k ≤ 1,000, 1 ≤ m ≤ 50), which represent the number of sky soldiers and the number of positions to place provisions separately.



The following k lines contain descriptions of landing parameters for the soldiers numbered from 1 to k. Each description consists of an integer L followed by L pairs of (x, p), which indicates that the probability of the soldier's landing on integer coordination
x is p. It is guaranteed that all the p values are positive real numbers, and the sum of p in a single line is exactly 1. The same x may appear more than once on the same line which you should simply add up all the probability p of the pairs with equal x.

The number of places on which all the soldiers could land is no more than 1000 and it can not be less than m.

The input ends with k=m=0.
 
Output
For each test case, output a line containing only one real number which indicates the minimum expected sum of distance these soldiers will move and should be rounded to two digits after the decimal point.
 
Sample Input
2 1
2 0 0.5 1 0.5
2 1 0.1 3 0.9
0 0
 
Sample Output
2.30
 
Source
 
Recommend
liuyiding   |   We have carefully selected several similar problems for you:  5053 5052 5051 5050 5049 
 

题意:

n个伞兵。落地后。每一个伞兵可能会落在若干个点上点都在x轴上。落在每一个点都有一个概率。如今在x轴上建立m个基地,每一个伞兵走到近期的基地。确定基地建立的地点使得全部伞兵所走的路程总和的期望最小。

思路:

乍一看像期望dp。细致思考后能够发现这是一个区间DP。如果一个伞兵落在x点。那么他走的路程的期望为p1*|x1-x|+p2*|x2-x|....*pm*|xm-x|。所以我们能够把n个伞兵等价成一个伞兵。

然后它到一个点的概率为全部伞兵到那点的概率总和。那如今就能够写出状态了。dp[i][j]表示在前i个位置建j个基地。

该等效伞兵走的路程的最小期望。那么这题就类似poj 1160
Post Office
那题了。转移方程为dp[i][j]=dp[k][j-1]+cost[k+1][i]。k<i。

cost[i][j]表示在i,j之间建一个基地且该基地负责集合[i,j]上的伞兵。

所走距离的期望。如今重点怎么高速算cost[i][j]了。考虑我们在算cost[j][i]的时候。随着j的减小基地的最优位置cur要么前移要么不变。所以我们就能够在O(n^2)的时间复杂度下算出了。

具体见代码:

#include<algorithm>
#include<iostream>
#include<string.h>
#include<stdio.h>
#include<map>
using namespace std;
const int INF=0x3f3f3f3f;
const int maxn=1010;
typedef long long ll;
struct node
{
int x;
double p;
} po[maxn];
map<int,double> mp;
map<int,double>::iterator it;
int n,m;
double dp[maxn][55],cost[maxn][maxn];
int main()
{
int k,i,j,l,x,cur,dis;
double p,lp,rp,cl,cr,tp; while(scanf("%d%d",&k,&m),k||m)
{
mp.clear();
for(i=0;i<k;i++)
{
scanf("%d",&l);
while(l--)
{
scanf("%d%lf",&x,&p);
mp[x]+=p;
}
}
n=0;
for(it=mp.begin();it!=mp.end();it++)
{
po[++n].x=it->first;
po[n].p=it->second;
}
for(i=n;i>=1;i--)
{
cost[i][i]=0;
cur=i;
rp=po[i].p;
lp=0;
cl=cr=0;
for(j=i-1;j>=1;j--)
{
dis=po[cur].x-po[j].x;
cl+=dis*po[j].p;//重心位置左边的期望和
lp+=po[j].p;//重心位置左边的概率和cr,rp为重心位置右边相应值
tp=cl+cr;//总期望
while(cur>1&&rp-lp<0)
{
dis=po[cur].x-po[cur-1].x;
cr+=dis*rp;
cl-=dis*lp;
cur--;
rp+=po[cur].p;
lp-=po[cur].p;
tp=cl+cr;
}
cost[j][i]=tp;
//printf("%d->%d tp %lf\n",j,i,tp);
}
}
for(i=0;i<=m;i++)
dp[i][i]=0;
for(i=1;i<=n;i++)
dp[i][0]=1e15;
for(j=1;j<=m;j++)
{
for(i=j;i<=n;i++)
{
tp=1e15;
for(k=j-1;k<i;k++)
tp=min(tp,dp[k][j-1]+cost[k+1][i]);
dp[i][j]=tp;
}
}
printf("%.2lf\n",dp[n][m]);
}
return 0;
}

hdu 4412 Sky Soldiers(区间DP)的更多相关文章

  1. hdu 4412 Sky Soldiers DP

    动态规划,主要是用单调性求区间的最小期望. 代码如下: #include<iostream> #include<stdio.h> #include<algorithm&g ...

  2. HDU 5115 Dire Wolf 区间dp

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5115 Dire Wolf Time Limit: 5000/5000 MS (Java/Others ...

  3. HDU 5693 D Game 区间dp

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5693 题解: 一种朴实的想法是枚举选择可以删除的两个或三个数(其他的大于三的数都能凑成2和3的和), ...

  4. hdu 4597 Play Game 区间dp

    Play Game Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=459 ...

  5. 【HDOJ】4412 Sky Soldiers

    1. 题目描述有$k$个伞兵跳伞,有$m$个汇点.当伞兵着陆后,需要走向离他最近的汇点.如何选择这$m$个结点,可以使得士兵最终行走的距离的期望最小.求这个最小的期望. 2. 基本思路假设已经选好了这 ...

  6. hdu 6049---Sdjpx Is Happy(区间DP+枚举)

    题目链接 Problem Description Sdjpx is a powful man,he controls a big country.There are n soldiers number ...

  7. hdu 5693 && LightOj 1422 区间DP

    hdu 5693 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5693 等差数列当划分细了后只用比较2个或者3个数就可以了,因为大于3的数都可以由2和3 ...

  8. hdu 4745 Two Rabbits 区间DP

    http://acm.hdu.edu.cn/showproblem.php?pid=4745 题意: 有两只兔子Tom Jerry, 他们在一个用石头围城的环形的路上跳, Tom只能顺时针跳,Jerr ...

  9. hdu 5181 numbers——思路+区间DP

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5181 题解:https://www.cnblogs.com/Miracevin/p/10960717.ht ...

随机推荐

  1. spring boot注解 --@spring-boot-devtools 自动加载修改的文件和类

    spriing boot中有一个注解,是自动加载修改后的类或者文件. 使用方法为: spring-boot-devtools=true 需要引入devtools包依赖: <dependency& ...

  2. Oracle WIHT AS 用法

    1.with table as 相当于建个临时表(用于一个语句中某些中间结果放在临时表空间的SQL语句),Oracle 9i 新增WITH语法,可以将查询中的子查询命名,放到SELECT语句的最前面. ...

  3. 阿里春招Android面经

    作者:淘萄桃 链接: https://www.jianshu.com/p/a07ccaad832d 本文由作者授权发布. 笔者参加18年阿里春招,有幸最终拿到阿里offer,base杭州,岗位客户端开 ...

  4. PHP命名空间学习笔记

    命名空间的支持版本:PHP 5 > 5.3.0,PHP 7 . 什么是命名空间 从广义上来说,命名空间是一种封装事物的方法.在很多地方都可以见到这种抽象概念.例如,在操作系统中目录用来将相关文件 ...

  5. Flask 学习(三)模板

    Flask 学习(三)模板 Flask 为你配置 Jinja2 模板引擎.使用 render_template() 方法可以渲染模板,只需提供模板名称和需要作为参数传递给模板的变量就可简单执行. 至于 ...

  6. 使用HTML5开发离线应用 - cache manifest

    HTML5 是目前正在讨论的新一代 HTML 标准,它代表了现在 Web 领域的最新发展方向.在 HTML5 标准中,加入了新的多样的内容描述标签,直接支持表单验证.视频音频标签.网页元素的拖拽.离线 ...

  7. [leetcode]Binary Tree Preorder Traversal @ Python

    原题地址:http://oj.leetcode.com/problems/binary-tree-preorder-traversal/ 题意:这题用递归比较简单.应该考察的是使用非递归实现二叉树的先 ...

  8. relatedTarget、fromElement、toElement相关元素

    在发生mouseover和mouseout事件时,还会涉及更多的元素.这两个事件都会涉及把鼠标指针从一个元素的边界之内移到另一个元素边界之内.对mouseover事件而言,事件的主目标是获得光标的元素 ...

  9. Java基础(十一):接口

    一.接口: 接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明.一个类通过继承接口的方式,从而来继承接口的抽象方法. 接口并不是 ...

  10. idea中dependencies中总是有红色波浪线(缺少dependency)的解决办法

    使用IDEA进行maven开发时,将新项目import进工作空间时,Maven Projects栏中的dependencies中总是有红色波浪线,如下图: 但是这些jar在我本地的maven仓库中实际 ...