浅析初步DP——过河卒

题目链接:P1002 过河卒

题意分析

  1. 目标:从A点走到B点
  2. 基本操作:向右走 和 向下走
    1. 本题因为起点和终点都是确定的,所以顺推和逆推都是相同的。下文就讲解逆推的分析
    2. 点(i,j)的方案数等于点(i,j-1)和点(i-1,j)的方案数和
  3. 限制条件:马所可以攻击到的点不能走

代码实现(对应上述各点)

  1. 构建数组F[ i ][ j ],用于存储到达坐标点(i,j) 的路径数,起点为F[ 0 ][ 0 ],终点为F[ n ][ m ]
  2. F[ i ][ j ]=F[ i-1 ][ j ]+F[ i ][ j-1 ]
  3. 构建bool数组B[ i ][ j ] 用于记录点(i,j)能否到达此点

动态转移方程:F[i][j]=F[i-1][j+F[i][j-1]  边界条件:F[0][j]=1,F[i][0]=1;(0<=i<=Bx,0<=j<=By)

完整代码

#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<string>
using namespace std;
long long a[25][25];
int main(void)
{
    int cx,cy,bx,by;
    memset(a,0,sizeof(a));
    cin>>bx>>by>>cx>>cy;
    for(int i=1; i<=bx+1; ++i)
    {
        for(int j=1; j<=by+1; j++)
        {
            a[i][j]=1;
        }
    }
    bx+=1;//位置从(1,1)有助于构建边界
    by+=1;
    cx+=1;
    cy+=1;
    a[1][1]=1;
    a[cx][cy]=0;//下面标记马所能到达的点
    a[cx+2][cy+1]=0;
    a[cx-2][cy+1]=0;
    a[cx+2][cy-1]=0;
    a[cx-2][cy-1]=0;
    a[cx+1][cy+2]=0;
    a[cx+1][cy-2]=0;
    a[cx-1][cy+2]=0;
    a[cx-1][cy-2]=0;
    for(int i=1; i<=bx; ++i)
    {
        for(int j=1; j<=by; j++)
        {
            if(i==1&&j==1)
            {
                continue;
            }
            else
            {
                if(a[i][j])
                {
                    a[i][j]=a[i-1][j]+a[i][j-1];
                }
            }
        }
    }
    cout<<a[bx][by]<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/Blacktears/p/11262801.html