码迷,mamicode.com
首页 > 其他好文 > 详细

CF24D Broken robot | DP 高斯消元

时间:2019-07-25 00:15:24      阅读:114      评论:0      收藏:0      [点我收藏+]

标签:eve   ref   图片   lan   img   using   iostream   get   continue   

题目链接

直接$dp$会有后效性,用高斯消元解决。

因为在这道题中列出的增广矩阵很有特点,所以用$O(M)$的时间复杂度就可以解出来。

注意$m=1$时的情况。

技术图片
#include<iostream>
#include<cstdio>
    using namespace std;
    double f[1005][1005],g[1005][1005];
int main()
{
    int n=0,m=0,x=0,y=0;
    scanf("%d%d%d%d",&n,&m,&x,&y);
    n-=x-1,x=1;
    for(int i=1;i<=m;i++) f[n][i]=0;
    for(int i=n-1;i>=1;i--)
    {
        if(m==1)
        {
            f[i][m]=2*((double)1/2*f[i+1][m]+1);
            continue;
        }
        for(int j=1;j<=m;j++)
            if(j==1)
            {
                g[j][j]=(double)2/3;
                g[j][j+1]=(double)-1/3;
                g[j][m+1]=(double)1/3*f[i+1][j]+1;
            }
            else if(j==m)
            {
                g[j][j]=(double)2/3;
                g[j][j-1]=(double)-1/3;
                g[j][m+1]=(double)1/3*f[i+1][j]+1;
            }
            else
            {
                g[j][j]=(double)3/4;
                g[j][j-1]=(double)-1/4;
                g[j][j+1]=(double)-1/4;
                g[j][m+1]=(double)1/4*f[i+1][j]+1;
            }
        for(int j=1;j<=m-1;j++)
        {
            double x=-g[j+1][j]/g[j][j];
            g[j][j]*=x;
            if(j!=1) g[j][j-1]*=x;
            g[j][j+1]*=x,g[j][m+1]*=x;
            g[j+1][j]+=g[j][j];
            g[j+1][j+1]+=g[j][j+1];
            g[j+1][m+1]+=g[j][m+1];
        }
        f[i][m]=g[m][m+1]/g[m][m];
        for(int j=m-1;j>=1;j--)
            f[i][j]=(g[j][m+1]-g[j][j+1]*f[i][j+1])/g[j][j];
    }
    printf("%.4f",f[x][y]);
    return 0;
}   
CF24D

 

CF24D Broken robot | DP 高斯消元

标签:eve   ref   图片   lan   img   using   iostream   get   continue   

原文地址:https://www.cnblogs.com/wozaixuexi/p/11241533.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!