Codeforce 559C DP

The Dynamic Programming is extensive and profound!

This problem you should think from the black cells

Code of AC:

#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef long long ll;
const ll N=2010;
const ll M=1e9+7;
pair<ll,ll> A[N];
ll f[N];
ll JC[200010],JCinv[200010];
ll C(ll n,ll m){
    return JC[n]*JCinv[m]%M*JCinv[n-m]%M;
}
ll quickmod(ll a,ll b,ll M){
    ll c=1;
    for(;b;b>>=1){
        if(b&1) c=c*a%M;
        a=a*a%M;
    }
    return c;
}
int main(){
    JC[0]=1;JCinv[0]=1;
    for(ll i=1;i<=200000;++i){
        JC[i]=JC[i-1]*i%M;
        JCinv[i]=quickmod(JC[i],M-2,M);
    }
    ll a,b,n;
    cin>>a>>b>>n;
    for(ll i=1;i<=n;++i){
        cin>>A[i].x>>A[i].y;
    }
    sort(A+1,A+1+n);
    A[n+1].x=a,A[n+1].y=b;
    for(ll i=1;i<=n+1;++i){
        f[i]=C(A[i].x+A[i].y-2,A[i].x-1);
        for(ll j=1;j<i;++j){
            if(A[j].x>A[i].x||A[j].y>A[i].y) continue;
            f[i]=(f[i]-f[j]*C(A[i].x+A[i].y-A[j].x-A[j].y,A[i].x-A[j].x))%M;
        }
    }
    cout<<(f[n+1]+M)%M<<endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值