luoguP1502过河题解】的更多相关文章

日常吐(fei)嘈(hua) 这道题作为最近卡了我3天的dp题(最后还是在题解的帮助下冥思苦想才过掉的题),窝觉得此题肥肠之脑洞,写此博客纪念 题解 过河 先来日常手玩样例: 咦感觉怎么手玩答案都像是3的亚子??? 吓得我打开了讨论组 我们发现题目没说一定要踩到石子上,所以类似0->2->4->7->10的走法也是可以的 手玩样例成功√ 容易看出来这是个dp,因为走法无后效性. 那么我们思考dp式子.设\(dp[i]\)表示跳到距离原点\(i\)的地方,最少踩过的石子数.因为最终可…
复习dp(迪皮)的时候刷到了一道简单路径压缩的题目(一点不会qwq) 题目描述链接. 正解: 首先呢,我们看到题目,自然而然的会想到这种思路: 设状态变量dp[i]表示从第一个格子开始经过一些跳跃跳到第i个格子上所踩到的最小石子数目. 那么,根据每一次跳s~t个格子,我们可以得出dp[i]可以从dp[i-t]到dp[i-s]转移过来,要综合考虑的话呢,就要在所有之前的情况中取一个石子数最小的在加上当前位置是否有石子数,就是dp[i]的值. 于是呢,有了整体思路,我们开始敲起了代码. 浏览数组范围…
题目链接:https://www.luogu.com.cn/problem/P1002 题目大意 棋盘上\(A\)点有一个过河卒,需要走到目标\(B\)点.卒行走的规则:可以向下.或者向右.同时在棋盘上CC点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之为"马拦过河卒". 棋盘用坐标表示,\(A\)点\((0, 0)\).\(B\)点\((n, m)\)(\(n\), \(m\)为不超过\(20\)的整数),同样马的位置坐标是需要给出的. 现在要求你计算…
原题传送门 题目分析 现有n个人在东岸,要过河去西岸.开始东岸有一艘船,船最多可承载2人,过河时间以耗时最长的人所需时间为准. 给定n个人的过河时间a,求所有人从东岸到西岸所需的最短时间. 当\(n=2\)时,易得答案为\(a[2]\).但问题在于当\(n>2\)如何解决. 贪心分析 对所有数据从小到大排序. 从小规模数据出发,当\(n=3\)时,不难想到可以先用\(a[1]\)将\(a[3]\)送过去,再让\(a[1]\)回来,这样就回归了\(n=2\)的情况. \(n>3\)时情况略为复杂…
首先,一道入门DP 然而对于蒟蒻的我已经难到爆了好吗 第一点:动态转移方程 用DP的关键! 这题我们可以发现每一步的方案数由上面的那步加上左边的那步得到 所以自然而然的方程就出来了: f[i][k]=f[i-1][k]+f[i][k-1] 第二点:DP边界 在所有的方案数计算内我们可以快速准确地发现:f[0][0]=1 即走到起点的方案数为一种 注意事项 本题有个较为坑爹的地方: 马可以在起点 所以需要特判,在代码环节会提到 那么代码就来了 #include<iostream> using n…
正文 简单描述一下题意: 士兵想要过河,他每一次可以往下走一格,也可以往右走一格,但马一步走到的地方是不能走的,问走到\(n\)行,\(m\)列有多少种走法 我们显然应该先根据马的位置将不能走的格子做一下标记 于是,就会写下这段代码: void work(long long x,long long y){ ma[x][y]=1; ma[x-1][y-2]=1; ma[x-2][y-1]=1; ma[x-2][y+1]=1; ma[x-1][y+2]=1; ma[x+1][y-2]=1; ma[x…
题目来源:洛谷P1052 思路 一开始觉得是贪心 但是仔细一想不对 是DP 再仔细一看数据不对 有点大 如果直接存下的话 显然会炸 那么就需要考虑离散化 因为一步最大跳10格 那么我们考虑从1到10都跳一遍 所以最大公倍数为2520 那么我们就可以枚举两个石头中间的长度mod 2520 即可缩短总长度 详细见代码 代码 #include<iostream> #include<algorithm> using namespace std; #define maxn 350000 #d…
题面 这道题是一道贪心+DP的好题: 首先排序是一定要干的事情. 然后我们分情况处理: 1.如果剩一个人,让最小的回来接他 2.如果剩两个人,让最小的回来接,剩下的那两个人(即最大的两个人)过去,让次小的回来,最小的两个过去 以上的两个方法一定是最优的,因为最大的人要不让最小的送,要不带一个次大的: 将上面的意义转为DP方程就是: 1.f[i]=f[i-1]+a[1]+a[n]; 2.f[i]=f[i-2]+a[1]+a[i-1]+a[2]+a[2]; 另外要注意边界的处理; #include…
显然是\(dp\),是用\(STL\)当中的\(map\)可以做到30分 #include <bits/stdc++.h>//万能头文件 using namespace std; int l,n,s,t; map<int,bool>m;//记有没有石头 map<int,int>dp;//最少踩到石头的个数 int main(){ cin>>l>>s>>t>>n; for(int i=1;i<=n;i++){ int…
题目描述: 样例: 实现解释: 一道因为没排序做了一个小时没做出来的二分答案模板题(手动呲牙) 知识点: 二分答案,最大值最小化 坑点: 排序,judge(mid)函数内计数的实现 其实从最长一步的最小距离就能大致看出:二分答案 因此需要做的就是对0~L这个区间二分查找满足题意的跳跃距离,直到达到终止条件. 唯一需要注意的就是:何时满足条件,二分答案中最重要的judge函数,可以先缕一下:只能跳m步,需要从0跳到L. 有步数限制,因此跳跃仅在不得不跳时进行(减少步数消耗),所以需要一个pre记录…