818. race car

参考链接:https://www.cnblogs.com/qisfj/p/leecode818.html

采用动态规划方法解题,

设dp[t]表示target为t时,最少需要的步数。

将连续的n次A操作改变的position记为nA,很显然,+iA-jA+kA等价于+kA-jA+iA,同时+iA+kA等价于+kA+iA。
所以当存在一串操作使position始终没有超过t,那么可以首先尽量尝试达到position,也就是说在position+speed<tposition+speed<t的情况下,
继续A操作依然可以保证有必要遍历的情况被遍历了。
假设t的二进制表示一共有i位,则iA即可影响到最高位,不需要有(i+1)A,因为若是出现了(i+1)A就必然影响了i+1位,为了使i+1位保持0由以下几种方式,
若之前执行的是+(i+1)A,那么就执行-(i+1)A,执行两次+iA,但无疑都多出了许多无意义的操作。
所以要达到一个t,若存在n使得2n−1=t2n−1=t成立,此n就是最佳的步数。否则,设n使2n−1−1<target<2n−12n−1−1<target<2n−1成立,则t可以从以下两种的一种中到达。
先到达2n−12n−1再经过一个R操作和dp[2n−1−t2n−1−t]次操作回到t。

先到达2n−1−12n−1−1再经过R操作、i个A操作、R操作、dp[t−2n−1+2it−2n−1+2i]操作回到t,其中i<n−1

class Solution {
public:
	int dp[10001];

	int racecar(int t){
		if (dp[t] != 0)
			return dp[t];
		int n = floor(log2(t)) + 1;
		if (1 << n == t + 1) dp[t] = n;
		else {
			dp[t] = n + 1 + racecar((1 << n) - 1 - t);//2^n-1、R、dp[2^n-1-t]
			for (int i = 0; i<n - 1; i++)//2^{n-1}-1、R、i个A、R、dp[t-2^{n-1}+2^i}]
				dp[t] = min(dp[t], n + i + 1 + racecar(t - (1 << (n - 1)) + (1 << i)));
		}
		return dp[t];
	}
};

2n1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值