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

codeforces 1247 E

时间:2019-10-31 13:45:27      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:double   前缀和   前缀   i+1   amp   bit   范围   using   def   

我们发现,如果倒着考虑的话,每个点向下和向右能到达的范围是确定的。
所以我们倒着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

标签:double   前缀和   前缀   i+1   amp   bit   范围   using   def   

原文地址:https://www.cnblogs.com/MXang/p/11770453.html

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