BZOJ 2306 [Ctsc2011] 幸福路径 [期望DP做法]

216 篇文章 0 订阅
160 篇文章 0 订阅

Description

有向图 G有n个顶点 1,  2, …,  n,点i 的权值为 w(i)。现在有一只蚂蚁,从
给定的起点 v0出发,沿着图 G 的边爬行。开始时,它的体力为 1。每爬过一条
边,它的体力都会下降为原来的 ρ 倍,其中ρ 是一个给定的小于1的正常数。而
蚂蚁爬到某个顶点时的幸福度,是它当时的体力与该点权值的乘积。
我们把蚂蚁在爬行路径上幸福度的总和记为 H。很显然,对于不同的爬行路
径,H 的值也可能不同。小 Z 对 H 值的最大可能值很感兴趣,你能帮助他计算
吗?注意,蚂蚁爬行的路径长度可能是无穷的。

Input

每一行中两个数之间用一个空格隔开。
输入文件第一行包含两个正整数 n,  m,分别表示 G 中顶点的个数和边的条
数。
第二行包含 n个非负实数,依次表示 n个顶点权值 w(1), w(2), …, w(n)。
第三行包含一个正整数 v0,表示给定的起点。
第四行包含一个实数 ρ,表示给定的小于 1的正常数。
接下来 m行,每行两个正整数 x, y,表示<x, y>是G的一条有向边。可能有
自环,但不会有重边。

Output

仅包含一个实数,即 H值的最大可能值,四舍五入到小数点后一位。

Sample Input

5 5
10.0 8.0 8.0 8.0 15.0
1
0.5
1 2
2 3
3 4
4 2
4 5

Sample Output

18.0

HINT

对于 100%的数据, n ≤ 100, m ≤ 1000, ρ ≤ 1 – 10^-6

, w(i) ≤ 100 (i = 1, 2, …, n)。

Source

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

期望DP~

思路来自http://www.cnblogs.com/jianglangcaijin/p/3799494.html#3672023,实在是高端啊。

注意:

1.初始化的时候要把i==0 || j==0 || k==0的情况也更新成-inf;

2.循环顺序不能随便改!


#include<cstdio>
#include<iostream>
using namespace std;

int n,m,S,x[1005],y[1005];
double a[105],f[105][105][105],pow[105],g[105],p,ans;

int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) scanf("%lf",&a[i]);
	scanf("%d%lf",&S,&p);pow[0]=1.0;
	for(int i=1;i<=104;i++) pow[i]=pow[i-1]*p;
	for(int i=1;i<=m;i++) scanf("%d%d",&x[i],&y[i]);
	for(int i=0;i<=n;i++)
	  for(int j=0;j<=n;j++)
	    for(int k=0;k<=n;k++) f[i][j][k]=-999999999;
	for(int i=1;i<=n;i++) f[0][i][i]=g[i]=a[i];
	for(int i=1;i<=n;i++)
	  for(int j=1;j<=n;j++)
	    for(int k=1;k<=m;k++) f[i][j][y[k]]=max(f[i][j][y[k]],f[i-1][j][x[k]]+a[y[k]]*pow[i]);
	for(int i=1;i<=n;i++)
	  for(int j=i;j<=n;j++) g[i]=max((f[j][i][i]-a[i]*pow[j])/(1-pow[j]),g[i]);
	for(int i=1;i<=n;i++)
	  for(int j=1;j<=n;j++) ans=max(ans,f[j][S][i]-a[i]*pow[j]+g[i]*pow[j]);
	printf("%.1lf\n",ans);
	return 0;
}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值