2 条题解

  • 0
    @ 2025-10-8 16:56:44
    #include<bits/stdc++.h> //by:hansang 代码来源于 y总 
    using namespace std;
    
    const int N=1100;
    int n, m, x, y; 
    double a[N][N], f[N][N];
    
    void gauss()
    {
    	for(int i=1; i<=m; i++) //下面每一行和上面消元 
    	{
    		double bl=a[i+1][i]/a[i][i]; //i行第i个*bl就变成i+1行第i个 
    		int d[3]={i, i+1, m+1}; //数组方便取值 
    		for(int j=0; j<3; j++) a[i+1][d[j]]-=a[i][d[j]]*bl; //和上面约 
    		a[i+1][i]=0; //加不加好像没什么关系 (  ̄ ▽  ̄ )" 
    	}
    	
    	for(int i=m; i; i--)
    	{
    		a[i-1][m+1]-=a[i-1][i]/a[i][i]*a[i][m+1];
    		//a[i−1][i]/a[i][i]也是个比例,不过是i行第i个*bl就变成i−1行第i个 
    		//基本思路和上面是一样的,就是i−1和 i约 
    		a[i-1][i]=0; //加不加 2号 
    	}
    }
    
    int main()
    {
    	scanf("%d%d%d%d", &n, &m, &x, &y);
    	
    	if(m==1) printf("%.4lf\n", 2.0*(n-x)); //只有向下和在原地可以选 
    	else
    	{
    		for(int i=n-1; i>=x; i--)
    		{
    			a[1][1]=2.0/3; a[1][2]=-1.0/3; a[1][m+1]=f[i+1][1]/3+1; //把参数存进数组里 (详细参考 y总推公式 16:20
    			a[m][m]=2.0/3; a[m][m-1]=-1.0/3; a[m][m+1]=f[i+1][m]/3+1;
    			for(int j=2; j<m; j++)
    			{
    				a[j][j-1]=-1.0/4; a[j][j]=3.0/4; a[j][j+1]=-1.0/4; 
    				a[j][m+1]=f[i+1][j]/4+1;
    			}
    			gauss();
    			for(int j=1; j<=m; j++) f[i][j]=a[j][m+1]/a[j][j]; //除参数既是答案 
    		}
    		printf("%.4lf\n", f[x][y]);
    	}
    	return 0;
    }
    
    • 0
      @ 2025-10-8 16:56:31
      #include<bits/stdc++.h> //by:hansang 代码来源于 y总 
      using namespace std;
      
      const int N=1100;
      int n, m, x, y; 
      double a[N][N], f[N][N];
      
      void gauss()
      {
      	for(int i=1; i<=m; i++) //下面每一行和上面消元 
      	{
      		double bl=a[i+1][i]/a[i][i]; //i行第i个*bl就变成i+1行第i个 
      		int d[3]={i, i+1, m+1}; //数组方便取值 
      		for(int j=0; j<3; j++) a[i+1][d[j]]-=a[i][d[j]]*bl; //和上面约 
      		a[i+1][i]=0; //加不加好像没什么关系 (  ̄ ▽  ̄ )" 
      	}
      	
      	for(int i=m; i; i--)
      	{
      		a[i-1][m+1]-=a[i-1][i]/a[i][i]*a[i][m+1];
      		//a[i-1][i]/a[i][i]也是个比例,不过是i行第i个*bl就变成i-1行第i个 
      		//基本思路和上面是一样的,就是i-1和 i约 
      		a[i-1][i]=0; //加不加 2号 
      	}
      }
      
      int main()
      {
      	scanf("%d%d%d%d", &n, &m, &x, &y);
      	
      	if(m==1) printf("%.4lf\n", 2.0*(n-x)); //只有向下和在原地可以选 
      	else
      	{
      		for(int i=n-1; i>=x; i--)
      		{
      			a[1][1]=2.0/3; a[1][2]=-1.0/3; a[1][m+1]=f[i+1][1]/3+1; //把参数存进数组里 (详细参考 y总推公式 16:20
      			a[m][m]=2.0/3; a[m][m-1]=-1.0/3; a[m][m+1]=f[i+1][m]/3+1;
      			for(int j=2; j<m; j++)
      			{
      				a[j][j-1]=-1.0/4; a[j][j]=3.0/4; a[j][j+1]=-1.0/4; 
      				a[j][m+1]=f[i+1][j]/4+1;
      			}
      			gauss();
      			for(int j=1; j<=m; j++) f[i][j]=a[j][m+1]/a[j][j]; //除参数既是答案 
      		}
      		printf("%.4lf\n", f[x][y]);
      	}
      	return 0;
      }
      • 1

      0x50 动态规划(0x55 环形与后效性处理)例题3:坏掉的机器人

      信息

      ID
      1377
      时间
      1000ms
      内存
      64MiB
      难度
      4
      标签
      递交数
      33
      已通过
      18
      上传者