zoukankan      html  css  js  c++  java
  • 题解 洛谷P1002 过河卒

    原题:https://www.luogu.com.cn/problem/P1002

    这是个很明显的dp题,我们现在分析下状态,用一个二维数组a表示走到了第i,j个位置的方案数。

    然后根据这个状态分析,走到这个点只能从(i-1,j)和(i,j-1)走来,这样我们的状态转移方程就得出了:

    a[i][j]=a[i-1][j]+a[i][j-1]然后我开开心心去写了个代码,发现全是0……,我估计你们不会犯这个错误(也可能一时激动)我忘了把初始点设为1。

    接下来就是些细节,马能到的位置和马能走到的位置a肯定为0,因此我们bool一个Map数组记录不能走的位置,直接不计算。

    马能走8个方位(别说你们不知道),这样根据输入提前确定好Map。

    接下来是代码:

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<string>
    #include<cmath>
    using namespace std;
    int fx[10] = {0, -2, -1, 1, 2, 2, 1, -1, -2};
    int fy[10] = {0, 1, 2, 2, 1, -1, -2, -2, -1};//马能走的8个方向 
    int n,m,x,y;
    long long a[101][101];//注意一定要long long 别问,问就是在没AC后找了半天 
    bool Map[101][101];//记录位置 
    int main()
    {
        cin>>n>>m>>x>>y;
        n+=10;m+=10;x+=10;y+=10;//我怕数组越界,也可能不会…… 
        a[10][10]=1;//一定别忘 
        Map[x][y]=1;//马的位置 
        for(int i=1;i<=8;i++)
            Map[x+fx[i]][y+fy[i]]=1;//处理Map 
        for(int i=10;i<=n;i++)
            for(int j=10;j<=m;j++)
            {
                if(!Map[i][j])
                    a[i][j]=max(a[i][j],a[i-1][j]+a[i][j-1]);
            }//dp 
            
        cout<<a[n][m];
    }
  • 相关阅读:
    Linux的chattr与lsattr命令详解
    Ant_的最完整build.xml解释
    ant安装和验证
    MySQL ALTER TABLE: ALTER vs CHANGE vs MODIFY COLUMN
    python简单爬虫技术
    selenium自动化测试打开新标签窗口
    js中的相等与不等运算
    table-layout:fixed 属性的解说
    DWZ与KindEditor编辑器的整合
    DWZ框架学习
  • 原文地址:https://www.cnblogs.com/zhaoxuelin/p/12775029.html
Copyright © 2011-2022 走看看