洛谷 - P1002 - 过河卒 - 简单dp

https://www.luogu.org/problemnew/show/P1002

方程很好想,题目也很暴力。感谢题目提示数据会很大。

#include<bits/stdc++.h>
using namespace std;
#define ll long long

ll cannotuse[21][21];
ll dp[21][21];
int bi,bj,ki,kj;

void set_false(int i,int j){
    if(i<0||i>bi||j<0||j>bj)
        return;
    cannotuse[i][j]=1;
}

void solve(){
    if(cannotuse[0][0])
        return;
    dp[0][0]=1;

    for(int i=0;i<=bi;i++){
        for(int j=0;j<=bj;j++){
            if(cannotuse[i][j])
                continue;
            else{
                if(i-1>=0&&cannotuse[i-1][j]==0)
                    dp[i][j]+=dp[i-1][j];
                if(j-1>=0&&cannotuse[i][j-1]==0)
                    dp[i][j]+=dp[i][j-1];
            }
        }
    }
}


int main(){
    scanf("%d%d",&bi,&bj);
    scanf("%d%d",&ki,&kj);
    set_false(ki,kj);
    set_false(ki+2,kj-1);
    set_false(ki+1,kj-2);
    set_false(ki-1,kj-2);
    set_false(ki-2,kj-1);
    set_false(ki-2,kj+1);
    set_false(ki-1,kj+2);
    set_false(ki+1,kj+2);
    set_false(ki+2,kj+1);
    solve();
    printf("%lld\n",max(0ll,dp[bi][bj]));
}

 

posted @ 2019-01-26 23:55  韵意  阅读(150)  评论(0编辑  收藏  举报