codeforces 1247 E

Posted mxang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了codeforces 1247 E相关的知识,希望对你有一定的参考价值。

我们发现,如果倒着考虑的话,每个点向下和向右能到达的范围是确定的。
所以我们倒着dp维护后缀和。
然后分上面还是左边进来的就行。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
const int N = 2e3+5;
const ll mod = 1e9+7;
int n,m;
char a[N][N];
ll f[N][N],g[N][N],b[N][N],c[N][N];
int main(){
    ios::sync_with_stdio(false);
    cin>>n>>m;
    if(n==1&&m==1){
        cout<<1<<' ';
        return 0;
    }
    for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin >> a[i][j];
    //倒着转移即可根据石头个数求前缀和
    f[n][m]=g[n][m]=1;
    for(int i=n;i>=1;i--){
        for(int j=m;j>=1;j--){
            if(i==n&&j==m)continue;
            if(j!=m)b[i][j]=b[i][j+1]+(a[i][j+1]=='R');
            if(i!=n)c[i][j]=c[i+1][j]+(a[i+1][j]=='R');
            f[i][j]=g[i][j+1]-g[i][m-b[i][j]+1];
            g[i][j]=f[i+1][j]-f[n-c[i][j]+1][j];
            (((f[i][j]+=f[i+1][j])%=mod)+=mod)%=mod;
            (((g[i][j]+=g[i][j+1])%=mod)+=mod)%=mod;
        }
    }
    ll ans = (f[1][1]-f[2][1]+g[1][1]-g[1][2])%mod;
    ans+=mod;ans%=mod;
    cout<<ans<<endl;
}

以上是关于codeforces 1247 E的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces 1247C. p-binary

Codeforces 1247D. Power Products

[Codeforces Round #522 (Div. 2, based on Technocup 2019 Elimination Round 3)][C. Playing Piano](代码片段

c_cpp Codeforces片段

Hat’s Words HDU1247

关于代码片段的时间复杂度