高斯消元+期望dp——light1151

高斯消元弄了半天没弄对。。

#include<bits/stdc++.h>
using namespace std;
#define maxn 205
#define eps 1e-8
double A[maxn][maxn],x[maxn],ans[maxn];
int nxt[maxn],n;
#define a A
void guess(int n){   //行,列
    for(int i=1;i<n;i++){
        if(a[i][i]==0){
            int id=0;
            for(int j=i+1;j<=n;j++)
                if(a[j][i]!=0)
                    id=j;
            for(int j=i;j<=n+1;j++)
                swap(a[i][j],a[id][j]);
        }
        for(int j=i+1;j<=n;j++){//消下三角 
            double t=a[j][i]/a[i][i];
            for(int k=i;k<=n+1;k++)
                a[j][k]-=(a[i][k]*t);
        }
    }
    
    for(int i=n;i>=1;i--)
    {
        for(int j=i+1;j<=n;j++)
            a[i][n+1]-=ans[j]*a[i][j];
        ans[i]=a[i][n+1]/a[i][i];
    }
}
int main(){        
    int t;cin>>t;
    for(int tt=1;tt<=t;tt++){
        int n;cin>>n;
        memset(nxt,0,sizeof nxt);
        memset(A,0,sizeof A);
        for(int i=0;i<n;i++){int x,y;cin>>x>>y;nxt[x]=y;}
        for(int i=1;i<100;i++){//建立矩阵 
            if(nxt[i]){
                A[i][i]=1;
                A[i][101]=0;
                A[i][nxt[i]]=-1;
            }    
            else {
                int k=0;
                for(int j=1;i+j<=100 && j<=6;j++){
                    k++;
                    A[i][i+j]=-1;
                }
                A[i][i]=k,A[i][101]=6;
            }    
        }        
                
        A[100][100]=1;A[100][101]=0;
        guess(100);
        printf("Case %d: %.10lf\n",tt,ans[1]);
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/zsben991126/p/10832222.html