首页 > 其他分享 >洛谷 P1002 [NOIP2002 普及组] 过河卒

洛谷 P1002 [NOIP2002 普及组] 过河卒

时间:2022-11-13 13:31:38浏览次数:43  
标签:map 洛谷 21 NOIP2002 int P1002 long ++ return

第一个dp(动态规划)题纪念一下

先尝试暴力写一个

递归,由于x与y只能增加,不存在回路。

#include<iostream>
using namespace std;
int a_x, a_y, h_x, h_y,sum=0;//a_x,a_y代表目标地点,h_x,h_y代表马的位置
long long map[21][21] = { 0 };//最后结果大,需要开long long
void dfs(int x,int y) {
if (x == a_x && y == a_y) {//到达目标地点
sum++;
return;
}
if (x+1<=a_x&&map[x + 1][y]!=-1) dfs(x + 1, y);//访问x+1
if (y+1<=a_y&&map[x][y + 1]!=-1) dfs(x, y + 1);//访问y+1
}
int main() {
cin >> a_x >> a_y >> h_x >> h_y;
int x_y[9][2] = { {0,0},{2,1},{1,2},{2,-1},{-1,2},{-2,1},{1,-2},{-2,-1},{-1,-2} };
for (int i = 0; i < 9; i++)//标记马的控制区域
map[h_x + x_y[i][0]][h_y+x_y[i][1]] = -1;
dfs(0,0);
cout<<sum<<endl;
return 0;
}

自然,这种方法中间会有两个点TLE。

不要问为啥不直接动态规划,问就是太菜,憋不出状态转移方程(悲)

进行动态规划

将map数组中的数字当成,在当前位置到目标位置的方法种数。

明显对于map数组中任意一个点(x,y)的值f(x,y),都等于它的f(x+1,y)+f(x,y+1),如果x+1,y+1小于等于20且不是马的控制点。

答案就在map数组的(0,0)处,根据这个性质,可以从目标位置开始填map数组,按照让x从大到小,y从大到小的顺序填充,直到填到(0,0)

#include<iostream>
using namespace std;
int a_x, a_y, h_x, h_y;
long long map[21][21] = { 0 };
int main() {
cin >> a_x >> a_y >> h_x >> h_y;

int x_y[9][2] = { {0,0},{2,1},{1,2},{2,-1},{-1,2},{-2,1},{1,-2},{-2,-1},{-1,-2} };
for (int i = 0; i < 9; i++)//初始化map
map[h_x + x_y[i][0]][h_y+x_y[i][1]] = -1;
map[a_x][a_y] = 1;//目标点的值为1

for(int j=0;j<=a_y;j++)//两层循环,访问的y值从大到小
for (int i=0;a_x-i>=0;i++) {//访问的x值从大到小
if (map[a_x-i][a_y-j]>=0){//防止修改马的控制点
if (map[a_x + 1-i][a_y - j] > 0 && a_x + 1-i <= 20)
map[a_x - i][a_y - j] += map[a_x-i + 1][a_y - j];//+=f(x+1,y)
if (map[a_x-i][a_y + 1 - j] > 0 && a_y + 1 - j <= 20)
map[a_x - i][a_y - j] += map[a_x-i][a_y + 1 - j];//+=f(x,y+1)
}
}
cout << map[0][0] << endl;
return 0;
}



标签:map,洛谷,21,NOIP2002,int,P1002,long,++,return
From: https://blog.51cto.com/u_15720148/5847740

相关文章

  • 洛谷P8849 『JROI-7』hibernal 二分法题解
    题目链接题目大意:交互题,给定N=2或18或64或512或1000,其中你要通过19次以内的询问在数列1-N中找到给定的未知的两个数x和y(本题解中设x<y),每次询问......
  • 洛谷-1052
    洛谷-1052思路文字版视频版Code#include<bits/stdc++.h>usingnamespacestd;#define_u_u_ios::sync_with_stdio(false),cin.tie(nullptr)#definecfint_o_o......
  • 洛谷P5309 Ynoi 2011 初始化 题解
    题面。我也想过根号分治,但是题目刷得少,数组不敢开,所以还是看题解做的。这道题目要用到根号分治的思想,可以看看这道题目和我的题解。题目要求处理一个数组a,支持如下操作......
  • 洛谷 P4135 作诗 题解
    题面。之前做过一道很类似的题目洛谷P4168蒲公英,然后看到这题很快就想到了解法,做完这题可以对比一下,真的很像。题目要求区间内出现次数为正偶数的数字的数量。数据范......
  • 洛谷刷题_P217 [USACO1.5]回文质数 Prime Palindromes
    题目P217[USACO1.5]回文质数PrimePalindromes题目链接https://www.luogu.com.cn/problem/P1217知识点埃氏筛原理:要得到自然数n以内的全部素数,必须把不大于根号n......
  • 洛谷P4168 蒲公英 分块处理区间众数模板
    题面。许久以前我还不怎么去机房的时候,一位大佬好像一直在做这道题,他称这道题目为“大分块”。其实这道题目的思想不只可以用于处理区间众数,还可以处理很多区间数值相关......
  • 洛谷P7223 [RC-04] 01 背包
    [RC-04]01背包题目描述P7223[RC-04]01背包-洛谷有一个容积为正无穷的背包,你要往里面放物品。你有\(n\)个物品,第\(i\)个体积为\(a_i\)。你有一个幸运数......
  • 洛谷 P7473 [NOI Online 2021 入门组] 重力球
    题面题目链接题解首先这题放在图论专题难度就下降了一大个档次ww我们注意到一点,就是如果你可以把两个点的位置记下来,一步操作之后,只会有四种可能的情况.两个点的位置......
  • 洛谷-3131
    洛谷-3131思路首先有一个\(brute-force\),从大到小枚举区间长度,然后通过前缀和找是否存在这样的区间,时间复杂度\(o(n^2)\)。在上述操作中,实际上我们做的就是找到两个下标......
  • 洛谷-4552
    洛谷-4552思路首先需要由区间加减法或者最后的形式(变为1个数)联想到差分在差分的形式下,只剩一个数意味着差分数组中\(2\dotsn\)都必须为0,其他任意。而给我们的操作......