ABC188 F - +1-1x2(dp,记忆化搜索)

题意:

在这里插入图片描述

解法:

令d[i]表示x变成i需要的最小操作次数,
由于数据较大,所以dp数组用map开,
然后就是要保证状态数较小,否则map不管用.

转移方程:
1.i%2==0,d[i]=min(d[i],d[i/2]+1).
2.i%2==1,d[i]=min(d[i],d[(i+1)/2]+2),d[i]=min(d[i],d[(i-1)/2+2]).
这种转移方程的好处:
因为所有转移方程都对i有除2操作,所以递归层数应该接近O(log)

code:

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxm=2e3+5;
map<int,int>d;//d[i]表示x变成i需要的操作次数
int x,y;
int dfs(int k){
    
    
    if(x==k)return 0;
    if(x>k)return x-k;
    if(d.count(k))return d[k];
    d[k]=k-x;
    if(k%2==0){
    
    
        d[k]=min(d[k],dfs(k/2)+1);
    }else{
    
    
        d[k]=min(d[k],dfs((k-1)/2)+2);
        d[k]=min(d[k],dfs((k+1)/2)+2);
    }
    return d[k];
}
signed main(){
    
    
    ios::sync_with_stdio(0);
    cin>>x>>y;
    cout<<dfs(y)<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44178736/article/details/112711075
今日推荐