zoukankan      html  css  js  c++  java
  • 浅析初步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;
    }
  • 相关阅读:
    Dom探索之基础详解
    PS切图(一)
    软件工程课程建议
    【一周读书】一点营养学笔记
    【一周读书】自卑与超越
    【一周读书】先教育好自己,再谈教导孩子
    【一周读书】学习如何学习
    【一周读书】你的理想
    结对项目编程
    Day4——提权学习之MySQL数据库(启动项提权)
  • 原文地址:https://www.cnblogs.com/Blacktears/p/11262801.html
Copyright © 2011-2022 走看看