zoukankan      html  css  js  c++  java
  • CF 24D Broken robot

    https://codeforces.com/problemset/problem/24/D

    题目

    有个N*M的棋盘上面放了一个机器人,坐标为$(i,j)$。这个机器人会从向左、向右、向下、不移动四种命令中选择执行,当处于最左端时不选择向左命令,最右端时不选择向右命令,每次都会等概率地选择可以选择的命令之一。问期望执行多少条命令可以到达最低端。

    1 ≤ N, M ≤ 1000

    题解

    设dp[i][j]为从(i,j)到最低端执行命令条数的期望,那么

    当宽度>=2时

    [dp[i][1]=frac{1}{3}(dp[i][1]+dp[i+1][1]+dp[i][2])+1]

    [dp[i][m]=frac{1}{3}(dp[i][m]+dp[i+1][m]+dp[i][m-1])+1]

    [dp[i][k]=frac{1}{4}(dp[i][k]+dp[i+1][k]+dp[i][k+1]+dp[i][k-1])+1,quad 1<k<m]

    如果把dp[i+1][t]看作已知数,那么就有m个方程,m个未知数,可以用高斯消元得到dp[i][t]的值

    这样的转移会执行n-i次

    当宽度==1时

    [dp[i][1]=frac{1}{2}(dp[i+1][1]+dp[i][1])+1]

    得到

    [dp[i][1]=dp[i+1][1]+2]

    AC代码

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #define REP(i,a,b) for(register int i=(a); i<(b); i++)
    #define REPE(i,a,b) for(register int i=(a); i<=(b); i++)
    #define PERE(i,a,b) for(register int i=(a); i>=(b); i--)
    using namespace std;
    typedef long long ll;
    int n,m,x,y;
    double a[1007][1007];
    double dp[1007];
    int main() {
    	scanf("%d%d", &n, &m);
    	scanf("%d%d", &x, &y);
    	memset(a,0,sizeof a);
    	memset(dp,0,sizeof dp);
    	if(m>1) {
    		REP(_,x,n) {
    			a[1][1]=2.0/3; a[1][2]=-1.0/3; a[1][m+1]=dp[1]/3+1;
    			a[m][m-1]=-1.0/3; a[m][m]=2.0/3; a[m][m+1]=dp[m]/3+1;
    			REP(i,2,m) {
    				a[i][i-1]=-1.0/4; a[i][i]=3.0/4; a[i][i+1]=-1.0/4; a[i][m+1]=dp[i]/4+1;
    			}
    			a[1][2]/=a[1][1]; a[1][m+1]/=a[1][1]; a[1][1]=1;
    			REPE(i,2,m) {
    				a[i][i]-=a[i-1][i]*a[i][i-1];
    				a[i][m+1]-=a[i-1][m+1]*a[i][i-1];
    				double t=1.0/a[i][i];
    				a[i][i]=1;
    				a[i][m+1]*=t;
    				if(i==m) break;
    				a[i][i+1]*=t;
    			}
    			PERE(i,m-1,1) {
    				a[i][m+1]-=a[i][i+1]*a[i+1][m+1];
    			}
    			REPE(i,1,m) dp[i]=a[i][m+1];
    		}
    		printf("%.10lf
    ", dp[y]);
    	} else {
    		double ans=(n-x)*2;
    		printf("%.10lf
    ", ans);
    	}
    	
    	return 0;
    }
    
  • 相关阅读:
    Linux常用命令-centos
    USACO 2006 Open, Problem. The Country Fair 动态规划
    USACO 2007 March Contest, Silver Problem 1. Cow Traffic
    USACO 2007 December Contest, Silver Problem 2. Building Roads Kruskal最小生成树算法
    USACO 2015 February Contest, Silver Problem 3. Superbull Prim最小生成树算法
    LG-P2804 神秘数字/LG-P1196 火柴排队 归并排序, 逆序对
    数据结构 并查集
    浴谷国庆集训 对拍
    1999 NOIP 回文数
    2010 NOIP 普及组 第3题 导弹拦截
  • 原文地址:https://www.cnblogs.com/sahdsg/p/12499087.html
Copyright © 2011-2022 走看看