CTSC2011 幸福路径

Posted kong-ruo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CTSC2011 幸福路径相关的知识,希望对你有一定的参考价值。

给定?张有向图,每个点有个权值,蚂蚁从某个点开始,初始体?为1,每经过?条边,体?会变为原来的p(0<p<1)倍,每爬到?个点,获得的幸福度为该点的权值乘上体?。求蚂蚁幸福度的最?值,保留?位?数。

$n leq 100,点权 leq 100$

sol:

正解是自动机的泵引理,一看就不可做,考虑暴力碾标算

由于点权不超过 100,体力很小的时候点权的贡献也很小,保留一位小数就会把很小的贡献舍去

做一个 dp

设 $f_{(i,j,k)}$ 表示走了 $i$ 步,从 $j$ 走到 $k$ 的最大收益

那么 $f_{(2^i,j,k)} = max_{l}{f_{(2^{i-1},j,l)} + f_{(2^{i-1},l,k)} imes p^{2^{i-1}}}$

多做几遍就行了

技术图片
#include <bits/stdc++.h>
#define LL long long
#define DB long double
#define rep(i, s, t) for (register int i = (s), i##end = (t); i <= i##end; ++i)
#define dwn(i, s, t) for (register int i = (s), i##end = (t); i >= i##end; --i)
using namespace std;
inline int read() {
    int x = 0, f = 1;
    char ch;
    for (ch = getchar(); !isdigit(ch); ch = getchar())
        if (ch == -)
            f = -f;
    for (; isdigit(ch); ch = getchar()) x = 10 * x + ch - 0;
    return x * f;
}
const int maxn = 110;
int n, m, st;
DB ans, p, f[maxn][maxn], g[maxn][maxn], w[maxn];
int main() {
    cin >> n >> m;
    rep(i, 1, n) rep(j, 1, n) f[i][j] = i == j ? 0 : -1e30;
    rep(i, 1, n) {
        double x;
        cin >> x;
        w[i] = x;
    }
    cin >> st;
    double x;
    cin >> x;
    p = x;
    rep(i, 1, m) {
        int x = read(), y = read();
        f[x][y] = p * w[y];
    }
    for (; p > (DB)(1e-8); p *= p) {
        rep(i, 1, n) rep(j, 1, n) g[i][j] = -1e30;
        rep(i, 1, n) rep(j, 1, n) rep(k, 1, n) g[i][j] = max(g[i][j], f[i][k] + f[k][j] * p);
        memcpy(f, g, sizeof(f));
    }
    rep(i, 1, n) ans = max(ans, f[st][i]);
    double res = ans + w[st];
    printf("%.1f
", res);
}
View Code

 

以上是关于CTSC2011 幸福路径的主要内容,如果未能解决你的问题,请参考以下文章

CTSC2011 幸福路径

CTSC2011 幸福路径

bzoj2306: [Ctsc2011]幸福路径(倍增+Floyed 逼近答案)

BZOJ2306 [Ctsc2011]幸福路径

[CTSC2016]单调上升路径

20+ css高频实用片段,提高幸福感的小技能你可以拥有噢