• 洛谷-P1002-过河卒(DP)


    题目描述

    棋盘上AA点有一个过河卒,需要走到目标BB点。卒行走的规则:可以向下、或者向右。同时在棋盘上CC点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。

    棋盘用坐标表示,AA点(0, 0)(0,0)、BB点(n, m)(n,m)(nn, mm为不超过2020的整数),同样马的位置坐标是需要给出的。

    现在要求你计算出卒从AA点能够到达BB点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。

    输入输出格式

    输入格式:

    一行四个数据,分别表示BB点坐标和马的坐标。

    输出格式:

    一个数据,表示所有的路径条数。

    输入输出样例

    输入样例#1: 
    6 6 3 3
    
    输出样例#1: 
    6
    

    说明

    结果可能很大!


    动态规划。

    子问题:从A(0,0)走到(i,j)的路径条数。

    转移方程:如果(i,j)不是马控制点:dp[i][j]+=dp[i-1][j]+dp[i][j-1]; 如果是dp[i][j]=0;


     1 #include<cstdio>
     2 #include<cstring>
     3 int dir[2][9]={{0,-2,-1,1,2,2,1,-1,-2},{0,1,2,2,1,-1,-2,-2,-1}};
     4 long long dp[25][25];
     5 bool mark[25][25];
     6 int main() {
     7     int nx,ny,hx,hy;
     8     scanf("%d%d%d%d",&nx,&ny,&hx,&hy);
     9     memset(mark,0,sizeof(mark));
    10     //标记马控制点 
    11     for(int i=0;i<9;++i)
    12         mark[hx+1+dir[0][i]][hy+1+dir[1][i]]=1;
    13     
    14     //初始化dp[][] 
    15     memset(dp,0,sizeof(dp));
    16     dp[1][1]=1;
    17      
    18     for(int i=1;i<=nx+1;i++)
    19         for(int j=1;j<=ny+1;j++) {
    20             if(mark[i][j]){
    21             dp[i][j]=0;
    22                 continue;
    23             }
    24 
    25             dp[i][j]+=dp[i-1][j]+dp[i][j-1];
    26 
    27         }
    28     printf("%lld",dp[nx+1][ny+1]);
    29     return 0;
    30 }
  • 相关阅读:
    XSLT的Replace函数
    Predicate<T> 委托
    《人生的智慧》第二章 人的自身
    Kmeans文本聚类:获取weka计算的聚类中心,完成文本聚类
    VCKbase转载:C++调用ADO
    Kmeans文本聚类系列之如何调用Preprocess类
    Kmeans文本聚类系列之全部代码
    近期计划
    Kmeans 聚类之建立文档向量模型(VSM)
    LibSVM文本分类之结果统计
  • 原文地址:https://www.cnblogs.com/yzhhh/p/10446834.html
Copyright © 2020-2023  润新知