洛谷 P1052 过河 (离散化+dp)
dp非常好想, f[i] = min(f[i-len] + stone[i]) s <= len <= t
然后因为L非常大,所以我就不知道该怎么搞了
我看到m只有100,而L有1e9,我就知道肯定要通过某种数学方法来离散化
然而我并没有想出来这个数学方法
看来题解,原来这个方法很简单,我怎么就没有想到
因为最大走10步,所以把距离对1到10的最小公倍数是2520取模就好了。
离散化之后就可以愉快地dp了
#include<cstdio>
#include<algorithm>
#include<cstring>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
#define _for(i, a, b) for(int i = (a); i <= (b); i++)
using namespace std;
const int MAXM = 312345;
const int MAXN = 112;
int f[MAXM], a[MAXN], d[MAXN];
int stone[MAXM], s, t, n, L;
int main()
{
scanf("%d%d%d%d", &L, &s, &t, &n);
_for(i, 1, n) scanf("%d", &a[i]);
sort(a + 1, a + n + 1);
_for(i, 1, n) d[i] = (a[i] - a[i-1]) % 2520;
_for(i, 1, n) a[i] = a[i-1] + d[i], stone[a[i]] = 1;
L = a[n];
memset(f, 0x3f, sizeof(f));
f[0] = 0;
_for(i, 1, L + t)
_for(len, s, min(i, t))
f[i] = min(f[i], f[i-len] + stone[i]);
int ans = 1e8;
_for(i, L, L + t)
ans = min(ans, f[i]);
printf("%d\n", ans);
return 0;
}
当然还有更好的优化方式
当距离小于t时保持不变,大于t时,改成d % t + t(一定要再加上t!!!)
我一开始是有想到,但是我想到还有s,s+1等
说实话不用想得这么完美,直接用最大的t模就好了。
这样空间可以开小很多。
#include<cstdio>
#include<algorithm>
#include<cstring>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
#define _for(i, a, b) for(int i = (a); i <= (b); i++)
using namespace std;
const int MAXM = 2123;
const int MAXN = 112;
int f[MAXM], a[MAXN], d[MAXN];
int stone[MAXM], s, t, n, L;
int main()
{
scanf("%d%d%d%d", &L, &s, &t, &n);
_for(i, 1, n) scanf("%d", &a[i]);
sort(a + 1, a + n + 1);
_for(i, 1, n)
{
d[i] = a[i] - a[i-1];
if(d[i] > t) d[i] = (d[i] % t) + t;
}
_for(i, 1, n) a[i] = a[i-1] + d[i], stone[a[i]] = 1;
L = a[n];
memset(f, 0x3f, sizeof(f));
f[0] = 0;
_for(i, 1, L + t)
_for(len, s, min(i, t))
f[i] = min(f[i], f[i-len] + stone[i]);
int ans = 1e8;
_for(i, L, L + t)
ans = min(ans, f[i]);
printf("%d\n", ans);
return 0;
}
洛谷 P1052 过河 (离散化+dp)的更多相关文章
- 洛谷p1052过河 路径压缩+dp
洛谷 P1052 过河 思路部分可以看这篇博客 我将在这里对其进行一些解释与补充 首先我们先看题 乍一看 这不是模板题吗 然后开开心心的敲了一个简单dp上去 #include<iostream& ...
- 洛谷P1052 过河
P1052 过河 题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上. 由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青 ...
- 洛谷P1052 过河【线性dp】【离散化】
题目:https://www.luogu.org/problemnew/show/P1052 题意: 青蛙要从0跳到超过$l$的地方,每一次可以跳$s$到$t$之间的任意数. 在河中有m个石头,要求在 ...
- 洛谷1052——过河(DP+状态压缩)
题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数 ...
- 洛谷 P1052 过河
题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数 ...
- 洛谷P1052过河
题目 不看数据范围的话是一个很简单的DP,可是加上数据范围之后就之前的做法就不行了. 所以我们考虑一下路径压缩. 小数据Code #include <iostream> #include ...
- 【题解】洛谷P1052 [NOIP2005TG] 过河(DP+离散化)
题目来源:洛谷P1052 思路 一开始觉得是贪心 但是仔细一想不对 是DP 再仔细一看数据不对 有点大 如果直接存下的话 显然会炸 那么就需要考虑离散化 因为一步最大跳10格 那么我们考虑从1到10都 ...
- 洛谷 P1002过河卒
洛谷 P1002过河卒 题目描述 棋盘上AA点有一个过河卒,需要走到目标BB点.卒行走的规则:可以向下.或者向右.同时在棋盘上CC点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点 ...
- 洛谷P1809 过河问题_NOI导刊2011提高(01)
To 洛谷.1809 过河问题 题目描述 有一个大晴天,Oliver与同学们一共N人出游,他们走到一条河的东岸边,想要过河到西岸.而东岸边有一条小船. 船太小了,一次只能乘坐两人.每个人都有一个渡河时 ...
随机推荐
- sed将上下两行并列
#cat log5 mmmm 1234 nnnn 2344 #sed -n '{N;s/\n/\t/p}' log5 mmmm 1234 nnnn 2344
- Flex tree展开节点问题!
问题: 使用 for each(var item:XML in menuTree.dataProvider) { menuTree.expandChildrenOf(item,true); ...
- 普通页面使用vue.js心得
在写本文之前要问自己几个问题,来说明为什么要这么做: 为什么在html中使用vue.js? vue.js已经趋于成熟,个人感觉比jquery要好用的多,但是在node环境下使用vue.js不用使用SS ...
- Could not find result map java.util.HashMap
Could not find result map java.util.HashMap 找不到结果图java.util.HashMap MyBatis 找不到返回的 'resultMap'!把resu ...
- 【 henuacm2016级暑期训练-动态规划专题 A 】Cards
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 很显然只要维护B,R,G的数量就好了. 可以很容易想到一个dfs(int a,int b,int c) 然后如果a+b+c==1,那 ...
- leetCode(24):Binary Search Tree Iterator
Implement an iterator over a binary search tree (BST). Your iterator will be initialized with the ro ...
- volatile 和 mutable 关键字
经常接触,但是过一段时间可能又忘了.做个记录. volatile是表示变量易变,不要放缓存,每次实际取,尤其是多线程. mutable表示一个const 类或者数据结构里面,某个字段是可以改变的.
- HDU 2421
由算术基本定理N=p1^e1*p2^e2....ps^es,可知一个素的因子个数为(e1+1)*(e2+1)*...*(es+1). 而N的一人因子必定也有n=p1^k1*p2^k2....*ps^k ...
- 关于amd64和ia64的理解
关于amd64和ia64的理解 学习了:http://blog.csdn.net/zubin006/article/details/5060383 IA64指的是Intel安腾系列CPU,不是X86架 ...
- JDK+JDBC+MySQL实例及注意事项
by qx.zhong Hangzhou 29 Jun 2014 开发环境 OS: Win8.1 x64 JDK: 1.8 SE DB: MySQL 5.5 Lib: mysql-connec ...