ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

AtCoder Beginner Contest 188 F- +1-1x2 记忆化搜索

2021-01-14 21:01:05  阅读:245  来源: 互联网

标签:AtCoder return Beginner Contest ll DFS ans 转移 dp


AtCoder Beginner Contest 188 F- +1-1x2 记忆化搜索


传送门: https://atcoder.jp/contests/abc188/tasks/abc188_f

题意

在 只 能 在 + 1 − 1 和 ∗ 2 三 种 操 作 的 情 况 下 , 如 果 将 X 变 为 Y ? 在只能在+1-1和*2三种操作的情况下,如果将X变为Y? 在只能在+1−1和∗2三种操作的情况下,如果将X变为Y?

思路

因 为 每 次 操 作 都 会 经 过 三 次 选 择 , 是 + 1 呢 还 是 − 1 呢 还 是 ∗ 2 呢 ? 因为每次操作都会经过三次选择,是+1呢还是-1呢还是*2呢? 因为每次操作都会经过三次选择,是+1呢还是−1呢还是∗2呢?

因 为 这 个 转 移 是 从 后 往 前 转 移 , 所 以 是 将 Y 如 何 变 为 X 即 可 , 只 不 过 ∗ 2 变 为 / 2 而 已 。 因为这个转移是从后往前转移,所以是将Y如何变为X即可,只不过*2变为/2而已。 因为这个转移是从后往前转移,所以是将Y如何变为X即可,只不过∗2变为/2而已。

所 以 有 一 下 转 移 方 案 : ( ) − 1 表 示 逆 过 程 所以有一下转移方案:()^{-1}表示逆过程 所以有一下转移方案:()−1表示逆过程

在 转 移 到 为 n 时 在转移到为n时 在转移到为n时

  • 当 n < = x 时 , r e t u r n      n − x ( ( − 1 ) − 1 转 移 ) 当n<=x时,return \;\;n-x((-1)^{-1}转移) 当n<=x时,returnn−x((−1)−1转移)
  • 当 n 为 任 意 数 时 , r e t u r n      x − n ( ( + 1 ) − 1 转 移 ) 当n为任意数时,return \;\;x-n((+1)^{-1}转移) 当n为任意数时,returnx−n((+1)−1转移)
  • 当 n 为 偶 数 时 , r e t u r n      D F S ( n / 2 ) + 1 ( ( ∗ 2 ) − 1 转 移 ) 当n为偶数时,return \;\;DFS(n / 2)+1((*2)^{-1}转移) 当n为偶数时,returnDFS(n/2)+1((∗2)−1转移)
  • 当 n 为 奇 数 时 , r e t u r n      D F S ( ( n − 1 ) / 2 ) + 2 ( + 1 ∗ 2 ) − 1 转 移 当n为奇数时,return \;\;DFS((n-1) / 2)+2(+1*2)^{-1}转移 当n为奇数时,returnDFS((n−1)/2)+2(+1∗2)−1转移
  • 当 n 为 奇 数 时 , r e t u r n      D F S ( ( n + 1 ) / 2 ) + 2 ( − 1 ∗ 2 ) − 1 转 移 当n为奇数时,return \;\;DFS((n+1)/2)+2(-1*2)^{-1}转移 当n为奇数时,returnDFS((n+1)/2)+2(−1∗2)−1转移
    最后取min即可。

看 到 上 面 有 很 多 状 态 转 移 , 所 以 我 们 可 以 在 D F S 过 程 中 记 忆 化 。 看到上面有很多状态转移,所以我们可以在DFS过程中记忆化。 看到上面有很多状态转移,所以我们可以在DFS过程中记忆化。

Code

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

ll X, Y;
map<ll, ll> dp;

ll DFS(ll n) {
    if(X >= n) return X - n; // 直接-1转移
    if(dp[n]) return dp[n]; // 记忆化搜索
    ll ans = n - X; // 直接+1转移
    ans = min(ans, DFS(n / 2) + 1 + n % 2); // 偶数直接*2 或者 先+1在*2
    if(n % 2) ans = min(ans, DFS(n / 2 + 1) + 2); // 先-1在*2
    return dp[n] = ans;
}

void solve() {
    cin >> X >> Y;
    
    cout << DFS(Y) << endl;
}

signed main() {
    solve();
}

标签:AtCoder,return,Beginner,Contest,ll,DFS,ans,转移,dp
来源: https://blog.csdn.net/fztsilly/article/details/112635820

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有