首页 > 其他分享 >CSP历年复赛题-P1002 [NOIP2002 普及组] 过河卒

CSP历年复赛题-P1002 [NOIP2002 普及组] 过河卒

时间:2024-05-22 11:09:00浏览次数:25  
标签:NOIP2002 int P1002 long nx 控制点 CSP dp

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

题意解读:从A(0,0)点走到B(n,m)点,只能向右或者向下,C点以及其控制点不能走。

解题思路:

根据题意,此题要么递归(DFS),要么递推(动态规划)

先分析数据规模,最大从起点到终点要走40步,每个步有2种走法,一共240种路径,DFS会超时,且方案数必须用long long

采用递推更合适,

设dp[i][j]是从(0, 0)到(i, j)的路径数,而(i, j)只能从(i - 1, j)或者(i, j - 1)走过去,

因此:

如果(i, j)不是马的控制点,有dp[i][j] = dp[i-1][j] + dp[i][j-1]

如果(i, j)是马的控制点,有dp[i][j] = 0

初始时:dp[0][0] = 1,从自己到自己只有一种方案

100分代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 25;

int n, m, x, y;

bool vis[N][N]; //马的控制点
int dx[8] = {2, 1, -1, -2, -2, -1, 1,  2 };
int dy[8] = {1, 2, 2,  1,  -1, -2, -2, -1};

long long dp[N][N]; //dp[i][j]表示从(0,0)到(i,j)的路径条数

void init()
{
    vis[x][y] = true;
    for(int i = 0; i < 8; i++)
    {
        int nx = x + dx[i];
        int ny = y + dy[i];
        if(nx >= 0 && nx <= n && ny >= 0 && ny <= m)
        {
            vis[nx][ny] = true;
        }
    }
}

int main()
{
    cin >> n >> m >> x >> y;

    init();

    dp[0][0] = 1;

    for(int i = 0; i <= n; i++)
    {
        for(int j = 0; j <= m; j++)
        {
            if(vis[i][j]) continue; //如果是马的控制点,则dp[i][j] = 0
            if(i - 1 >= 0) dp[i][j] += dp[i - 1][j];
            if(j - 1 >= 0) dp[i][j] += dp[i][j - 1];
        }
    }

    cout << dp[n][m];

    return 0;
}

 

标签:NOIP2002,int,P1002,long,nx,控制点,CSP,dp
From: https://www.cnblogs.com/jcwy/p/18205787

相关文章

  • CSP历年复赛题-P1042 [NOIP2003 普及组] 乒乓球
    原题链接:https://www.luogu.com.cn/problem/P1042题意解读:分别针对11分制和21分制,输出每局比分。只需要判断一局的结束条件:得分高者如果达到11或者21,且比分间隔大于等于2分,则表示一局结束,可开始下一局,用模拟法即可解决。100分代码:#include<bits/stdc++.h>usingnamespaces......
  • [CSP-S 2023] 种树
      #include<bits/stdc++.h>#definelllonglong#definepbpush_back#definemxn100003#definerep(i,a,b)for(inti=a;i<=b;++i)#definerept(i,a,b)for(inti=a;i<b;++i)usingnamespacestd;intn,p[mxn],d[mxn],ct[mxn];lla[mxn],b[mxn],c[m......
  • CSP历年复赛题-P1049 [NOIP2001 普及组] 装箱问题
    原题链接:https://www.luogu.com.cn/problem/P1049题意解读:装尽可能多的物品,使得总体积越大越好,即剩余空间最小,还是一个01背包问题,物品的体积就是其价值。解题思路:01背包模版题,物品体积、价值相同,直接采用一维dp。100分代码:#include<bits/stdc++.h>usingnamespacestd;co......
  • CSP历年复赛题-P1035 [NOIP2002 普及组] 级数求和
    原题链接:https://www.luogu.com.cn/problem/P1035题意解读:根据公式模拟法求解即可。解题思路:枚举i,计算sum,如果sum>k,则输出i100分代码:#include<bits/stdc++.h>usingnamespacestd;intmain(){intk;cin>>k;doublesum=0;inti=0;while(......
  • CSP历年复赛题-P1036 [NOIP2002 普及组] 选数
    原题链接:https://www.luogu.com.cn/problem/P1036题意解读:题目即要在n个数中,枚举出所有的子集,当子集中数字个数刚好为k时,求和,判断是否是素数。解题思路:方法一:二进制法通过二进制法,可以枚举一个集合中所有元素“选”或者“不选”的情况,用二进制1表示选该元素,二进制0表示不选。......
  • CSP历年复赛题-P1030 [NOIP2001 普及组] 求先序排列
    原题链接:https://www.luogu.com.cn/problem/P1030题意解读:已知中序、后序,求先序。解题思路:与洛谷题单指南-二叉树-P1827[USACO3.4]美国血统AmericanHeritage非常类似,不在介绍过程,直接给出代码。100分代码:#include<bits/stdc++.h>usingnamespacestd;stringin,post......
  • CSP历年复赛题-P1023 [NOIP2000 普及组] 税收与补贴问题
    原题链接:https://www.luogu.com.cn/problem/P1023题意解读:给定商品单价和对应销量表,计算使得采用预期价格销售得到最大利润时的最小补贴或者税收。解题思路:1、样例模拟31281303012031110-1-115政府预期价格:31商品成本:28,按成本价售卖销量:130商品单价:30,对应销量:120......
  • CSP历年复赛题-P1028 [NOIP2001 普及组] 数的计算
    原题链接:https://www.luogu.com.cn/problem/P1028题意解读:给定n,构造数列,可以用递归或者递推。解题思路:1、递归定义count(n)返回数列的个数  n==1时,count(n)=1  n!=1时,count(n)=1+count(1)+count(2)+...+count(n/2)注意,递归会导致大量重复计算,需要用一个hash......
  • CSP历年复赛题-P1029 [NOIP2001 普及组] 最大公约数和最小公倍数问题
    原题链接:https://www.luogu.com.cn/problem/P1029题意解读:已知x,y,求有多少对p、q,使得p、q的最大公约数为x,最小公倍数为y。解题思路:枚举法即可。枚举的对象:枚举p,且p必须是x的倍数,还有p<=yq的计算:q=x*y/p,q要存在,必须x*y%p==0,且gcd(p,q)==x100分代码:#include......
  • CSP历年复赛题-P1022 [NOIP2000 普及组] 计算器的改良
    原题链接:https://www.luogu.com.cn/problem/P1022题意解读:求解一元一次方程。解题思路:直接采用模拟法,对字符串进行解析设x保存未知数字母设lx保存"="左边的未知数系数,多个系数要累加设l保存"="左边的整数,多个整数要累加设rx保存"="右边的未知数系数,多个系数要累加设r保存"......