洛谷1052——过河(DP+状态压缩)
发布日期:2022-04-01 13:25:20 浏览次数:37 分类:博客文章

本文共 3304 字,大约阅读时间需要 11 分钟。

题目描述

在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧。在桥上有一些石子,青蛙很讨厌踩在这些石子上。由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数轴上的一串整点:

0
,
1
,
,
L
0,1,…,L
(其中
L
L
是桥的长度)。坐标为
0
0
的点表示桥的起点,坐标为
L
L
的点表示桥的终点。青蛙从桥的起点开始,不停的向终点方向跳跃。一次跳跃的距离是
S
S
T
T
之间的任意正整数(包括
S
,
T
S,T
)。当青蛙跳到或跳过坐标为
L
L
的点时,就算青蛙已经跳出了独木桥。

题目给出独木桥的长度

L
L
,青蛙跳跃的距离范围
S
,
T
S,T
,桥上石子的位置。你的任务是确定青蛙要想过河,最少需要踩到的石子数。

输入输出格式

输入格式:

第一行有

1
1
个正整数
L
(
1
L
1
0
9
)
L(1 \le L \le 10^9)
,表示独木桥的长度。

第二行有

3
3
个正整数
S
,
T
,
M
S,T,M
,分别表示青蛙一次跳跃的最小距离,最大距离及桥上石子的个数,其中
1
S
T
10
1 \le S \le T \le 10
,
1
M
100
1 \le M \le 100

第三行有

M
M
个不同的正整数分别表示这
M
M
个石子在数轴上的位置(数据保证桥的起点和终点处没有石子)。所有相邻的整数之间用一个空格隔开。

输出格式:

一个整数,表示青蛙过河最少需要踩到的石子数。

输入输出样例

输入样例#1:

102 3 52 3 5 6 7

输出样例#1:

2

说明

对于30%的数据,

L
10000
L \le 10000

对于全部的数据,

L
1
0
9
L \le 10^9

2005提高组第二题

思路

如果不考虑数据范围的话,可以很快得出递推关系式:

d
p
[
i
]
=
m
i
n
(
d
p
[
i
+
k
]
+
a
[
i
]
)
  
(
S
k
T
)
dp[i]=min(dp[i+k]+a[i])\ \ (S\leq k \leq T)
a
[
i
]
a[i]
i
i
点的石头数
d
p
[
i
]
dp[i]
表示到达
i
i
点踩到的最少石头数)

然鹅看了数据范围后,时间和空间都是过不去的。所以需要选择别的方法:

  • S
    =
    T
    S=T
    的时候,可以很容易得到:所有在
    S
    S
    倍数位置上的点,都会走到,所以对该种情况进行特判

  • 我们可以发现石子在桥上放置的是非常稀疏的,而且当点的位置超过一定范围,点都是可以跳到的。所以可以将石子所在的位置压缩到这个范围里去。将压缩后位置储存起来作为新的石头的位置,按照这个位置进行dp即可

假设每次走

p
p
或者
p
+
1
p+1
步.我们知道
g
c
d
(
p
,
p
+
1
)
=
1
gcd(p,p+1)=1
.
由扩展欧几里得可知,对于二元一次方程组:
p
x
+
(
p
+
1
)
y
=
g
c
d
(
p
,
p
+
1
)
px+(p+1)y=gcd(p,p+1)
是有整数解的,即可得:
p
x
+
(
p
+
1
)
y
=
s
px+(p+1)y=s
是一定有整数解的。
p
x
+
(
p
+
1
)
y
=
s
px+(p+1)y=s
的解为:
x
=
x
0
+
(
p
+
1
)
t
,
y
=
y
0
p
t
x=x_0+(p+1)t,y=y_0−pt
。令
0
x
p
0\leq x\leq p
(通过增减
t
t
p
+
1
p+1
来实现),
s
>
p
×
(
p
+
1
)
1
s>p\times (p+1)−1
则有:
y
=
s
p
x
p
+
1
s
p
2
p
+
1
>
p
(
p
+
1
)
1
p
x
p
+
1
0
y=\dfrac {s-px}{p+1}\geq \dfrac {s-p^{2}}{p+1} >\dfrac {p\left( p+1\right) -1-px}{p+1}\geq 0
即表示,当
s
p
×
(
p
+
1
)
s\leq p\times (p+1)
时,
p
x
+
(
p
+
1
)
y
=
s
px+(p+1)y=s
有两个非负整数解,每次走
p
p
步或者
p
+
1
p+1
步,
p
×
(
p
+
1
)
p\times (p+1)
之后的地方均能够到达。
如果两个石子之间的距离大于
p
×
(
p
+
1
)
p\times (p+1)
,那么就可以直接将他们之间的距离更改为
p
×
(
p
+
1
)
p \times (p+1)
综上,得到压缩路径的方法:若两个石子之间的距离大于
t
×
(
t
1
)
t\times(t−1)
,则将他们的距离更改为
t
×
(
t
1
)
t\times (t−1)

t
10
为t\leq10
,因此我们可以直接将大于
10
×
9
10\times9
的距离直接化为
90
90
.

关于路径压缩常数的选择,证明过程详见:

AC代码

/*************************************************************************	 > Author: WZY	 > School: HPU	 > Created Time:   2019-02-03 15:55:49	 ************************************************************************/#include 
#define ll long long#define ull unsigned long long#define ms(a,b) memset(a,b,sizeof(a))#define INF 0x7f7f7f7fconst int maxn=1e6+10;const int mod=1e9+7;using namespace std;int a[maxn];int dp[maxn];int vis[maxn];int main(int argc, char const *argv[]){ ios::sync_with_stdio(false); cin.tie(0); int L; int ans=0; int s,t,m; cin>>L; cin>>s>>t>>m; for(int i=1;i<=m;i++) cin>>a[i]; if(s==t) { for(int i=1;i<=m;i++) { if(a[i]%s==0) ans++; } cout<
<
=0;i--) { dp[i]=INF; for(int j=s;j<=t;j++) dp[i]=min(dp[i],dp[i+j]+vis[i]); } cout<
<

转载地址:https://www.cnblogs.com/Friends-A/p/11054978.html 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:HDU 6608:Fansblog(威尔逊定理)
下一篇:mod4最优路径问题(转载)

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2024年04月26日 06时41分44秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章