zoukankan      html  css  js  c++  java
  • Codeforces 1247E. Rock Is Push

    传送门

    显然考虑 $dp$ ,设 $fx[i][j]$ 表示从 $(i,j)$ 出发往下走一格,最终到达 $(n,m)$ 的方案数,$fy[i][j]$ 表示从 $(i,j)$ 出发往右走一格,最终到达 $(n,m)$ 的方案数

    如果 $(i,j)$ 本身有石头就把这个石头忽略

    那么对于 $fx[i][j]$ ,如果 $(i+1,j)$ 没有石头,转移为 $fx[i][j]=fx[i+1][j]+fy[i+1][j]$

    如果 $(i+1,j)$ 有石头,因为 $fx[i+1][j]$ 没有算到本身的石头,所以方案中多出了一类往下走到 $(x,y)$ 再往右的方案

    但是因为这个石头的存在,我们最多只能走到 $(x-1,y)$ ,那么方案便多出了 $fy[x][y]$ ,再减去即可,显然 $x,y$ 可以通过预处理每列的前缀石头数得到

    然后对于 $fy$ 也差不多转移,所以就做完了

    记得特判 $(n,m)=(1,1)$ 的情况

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    using namespace std;
    typedef long long ll;
    inline int read()
    {
        int x=0,f=1; char ch=getchar();
        while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); }
        while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }
        return x*f;
    }
    const int N=2007,mo=1e9+7;
    inline int fk(int x) { return x>=mo ? x-mo : x; }
    int n,m,ans;
    int cntx[N][N],cnty[N][N];
    int fx[N][N],fy[N][N];
    char s[N][N];
    int main()
    {
        n=read(),m=read();
        for(int i=1;i<=n;i++)
            scanf("%s",s[i]+1);
        for(int i=n;i>=1;i--)
            for(int j=m;j>=1;j--)
            {
                cntx[i][j]=cntx[i+1][j]+(s[i][j]=='R');
                cnty[i][j]=cnty[i][j+1]+(s[i][j]=='R');
            }
        for(int i=1;i<m;i++)
            if(!cnty[n][i]) fy[n][i]=1;
        for(int i=1;i<n;i++)
            if(!cntx[i][m]) fx[i][m]=1;
        for(int i=n-1;i;i--)
            for(int j=m-1;j;j--)
            {
                fx[i][j]=fk(fx[i+1][j]+fy[i+1][j]);
                if(s[i+1][j]=='R') fx[i][j]=fk(fx[i][j]- fy[ n-cntx[i+1][j]+1 ][j] +mo);
                fy[i][j]=fk(fx[i][j+1]+fy[i][j+1]);
                if(s[i][j+1]=='R') fy[i][j]=fk(fy[i][j]- fx[i][ m-cnty[i][j+1]+1 ] +mo);
            }
        if(n==1&&m==1&&s[1][1]=='.') ans=1;
        else ans=fk(fx[1][1]+fy[1][1]);
        printf("%d
    ",ans);
        return 0;
    }
  • 相关阅读:
    JAVA课程课后作业之使用递归完成回文
    原码、补码,反码以及JAVA中数值采用哪种码表示
    JAVA课后作业01
    java开学考试有感以及源码
    自动生成30道小学四则运算题目
    统计文档中单词出现频率
    JAVA课程课后作业03之动手动脑
    暑假假期周进度报告(第八周)
    字节流FileInputStream FileOutputStream四种读写,包装流BufferedOutputStream BufferedInputSream 缓冲区默认8192字节
    多态性
  • 原文地址:https://www.cnblogs.com/LLTYYC/p/11750207.html
Copyright © 2011-2022 走看看