HDU 4418 (期望dp 高斯消元)

 题意:有一个坐标轴,从s点开始,为了到达e点,走的时候是周而复始循环的,比如 0 1 2 3 3 2 0.。。,从一个点开始,每走k步都有pk的概率停下,问正好停在目标点的期望是多少;

思路:设dp[i]是在i点到e点的期望,dp[i]=p1*dp[i+1]+p2*dp[i+2]....+pk*dp[i+k](因为期望都是倒着推)

gauss 求解就可以了

因为有不能到的点,如果不能到的点算进去可能会使式子无解,所以不能倒得点不需要跟任何点关联,给他一个初始值就好

这样需要先BFS判不能到的点。 

#include
using namespace std;
const int N=200;
double p[N], eps=1e-10,  sp;
int n, m, Y, X, D;
bool vis[N];

/****************************///高斯消元模板
int equ, var, a[N][N], x[N];
int Gauss(){
    int i, j, k, col, max_r;
    for(int k=0, col=0; kfabs(a[max_r][col]))
                max_r=i;
        if(fabs(a[max_r][col]) q;
    q.push(X);
    vis[X]=1;
    while(!q.empty()){
        int it=q.front(); q.pop();
        for(int i=1; i<=m; i++){
            if(p[i]
模板二:
double a[N][N], x[N];
bool free_x[N];
int sgn(double x){
    return (x>eps)-(x-eps);
}
int gauss(){
    int i, j, k, max_r, col;
    double tmp;
    int free_x_num, free_index;
    int equ=n, var=n;
    col=0;
    memset(free_x, true, sizeof free_x);
    for(k=0; k0) max_r=i;
        }
        if(max_r!=k){
            for(j=k; j=0; i--){
            free_x_num=0;
            for(j=0; j1) continue;
            tmp=a[i][var];
            for(j=0; j=0; i--){
        tmp=a[i][var];
        for(j=i+1; j

 

你可能感兴趣的:(dp,各种板子)