洛谷 P1002 过河卒

目录:

  • 题目
  • 题意
  • 分析
  • AC后感想
  • 代码

题目:

过河卒 题目

题意:

求有多少种方案可以是卒从A点到B点,且不受马的伤害

分析:

动态规划(递推?)

DPi,j 为卒从起点走到 (i,j) 点所有可行的路径总数,所以 DP0,0=1 ,我们要求的就是 DPnx,ny
通过卒行走的规则可以得出状态转移方程(在下面),马需要判断一下即可。(标记数组只是其中一种方法)
要注意数组越界的坑;答案要用 longlong ,在此题的数据范围中,最大的答案大到137846521561137846521561 ,这个数字用 int 已经存不下了。
状态转移方程 DPi,j=DPi1,j+DPi,j1

AC后感想:

入门级别的一题,支持练手。

代码:

#include
#include
#include
#include
#include
#include
#define LL long long
using namespace std;
inline LL read() {
    LL d=0,f=1;char s=getchar();
    while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
    while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();}
    return d*f;
}
const int t[2][9]={{0,-2,-1,1,2,2,1,-1,-2},{0,1,2,2,1,-1,-2,-2,-1}};
long long dp[21]={1};
bool park[21][21];
int main() {
    int nx,ny,hx,hy;
    nx=read();ny=read();hx=read();hy=read();
    for(int i=0;i<9;++i)
        if(hx+t[0][i]>=0&&hx+t[0][i]<=nx&&hy+t[1][i]>=0&&hy+t[1][i]<=ny)
            park[hx+t[0][i]][hy+t[1][i]]=1;
    for(int i=0,j;i<=nx;++i)
        for(dp[0]*=!park[i][0],j=1;j<=ny;++j)
            (dp[j]+=dp[j-1])*=!park[i][j];
    printf("%lld",dp[ny]);
    return 0;
}

你可能感兴趣的:(洛谷 P1002 过河卒)