2 solutions
-
0
Guest MOD
-
2
DP捏
显然 到达任意的位置
只有从左边和从上面掉下来两条路子
不会真的有人傻到向左走吧由于彩虹猫没法腾空
so 只有天花板和地板两条道路
(温馨提示:那个图就是个坑

你要真看这个图,那大约你也看不到下面的
了
读题是这道题最难的部分
我说的真的很难绷 上下蹿需要的是高度差大小的能量
向右跑不需要能量
网格图的意思是:

横坐标或许不用管,但是纵坐标挺坑的 注意:它看的是网格线,不是方格子
好的,知道了这些就足够码出一个dp了,只有两层还是线性的dp还要教吗?
Code
#include <iostream> using namespace std; const long long INF=1e17; long long n,t[100114],f[100114]; long long dp[100114][3]; int main() { cin>>n; for(int i=1;i<=n;i++) { cin>>t[i]; dp[i][1]=INF; } for(int i=1;i<=n;i++) { cin>>f[i]; dp[i][2]=INF; } dp[1][1]=0; dp[1][2]=t[1]-f[1]; for(int i=2;i<=n;i++) { if(f[i]<=f[i-1]) dp[i][1]=dp[i-1][1]; if(t[i]>=t[i-1]) dp[i][2]=dp[i-1][2]; dp[i][1]=min(dp[i][1],dp[i][2]+t[i]-f[i]); dp[i][2]=min(dp[i][2],dp[i][1]+t[i]-f[i]); if(t[i-1]<=f[i] || f[i-1]>=t[i]) dp[i][1]=dp[i][2]=INF;//请注意这里的特判,会有彩虹猫被卡死的可能哦 } if(dp[n][1]==INF) cout<<"-1"; else cout<<dp[n][1]; return 0; }
Information
- ID
- 254
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 4
- Tags
- (None)
- # Submissions
- 26
- Accepted
- 17
- Uploaded By