<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ring &#8211; Huahua&#8217;s Tech Road</title>
	<atom:link href="https://zxi.mytechroad.com/blog/tag/ring/feed/" rel="self" type="application/rss+xml" />
	<link>https://zxi.mytechroad.com/blog</link>
	<description></description>
	<lastBuildDate>Mon, 07 Apr 2025 02:28:58 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.7.2</generator>

<image>
	<url>https://zxi.mytechroad.com/blog/wp-content/uploads/2017/09/cropped-photo-32x32.jpg</url>
	<title>ring &#8211; Huahua&#8217;s Tech Road</title>
	<link>https://zxi.mytechroad.com/blog</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>花花酱 LeetCode 514. Freedom Trail</title>
		<link>https://zxi.mytechroad.com/blog/dynamic-programming/leetcode-514-freedom-trail/</link>
					<comments>https://zxi.mytechroad.com/blog/dynamic-programming/leetcode-514-freedom-trail/#respond</comments>
		
		<dc:creator><![CDATA[zxi]]></dc:creator>
		<pubDate>Mon, 07 Apr 2025 02:11:53 +0000</pubDate>
				<category><![CDATA[Dynamic Programming]]></category>
		<category><![CDATA[dp]]></category>
		<category><![CDATA[head]]></category>
		<category><![CDATA[ring]]></category>
		<guid isPermaLink="false">https://zxi.mytechroad.com/blog/?p=10292</guid>

					<description><![CDATA[一眼DP，看数据规模标程应该是O(1003)。 阶段肯定就是吟唱完一个字符，状态和哪个字符在12:00点有关。 所以我们定义 dp[i][j] := 吟唱完keys[0~i]后，rings[j]停在12:00点所需要的最少步数。 转移方程：dp[i][j] = min(dp[i-1][k] + steps(k, j) + 1) if keys[i] == rings[j] else +inf. 第i-1字符吟唱完ring停留在k，第i个字符吟唱完ring停留在j (rings[j] 必须和 keys[i] 相同)，steps(k,&#8230;]]></description>
										<content:encoded><![CDATA[
<p>一眼DP，看数据规模标程应该是O(100<sup>3</sup>)。</p>



<p>阶段肯定就是吟唱完一个字符，状态和哪个字符在12:00点有关。</p>



<p>所以我们定义 dp[i][j] := 吟唱完keys[0~i]后，rings[j]停在12:00点所需要的最少步数。</p>



<p>转移方程：dp[i][j] = min(dp[i-1][k] + steps(k, j) + 1)  if keys[i] == rings[j] else +inf.</p>



<p>第i-1字符吟唱完ring停留在k，第i个字符吟唱完ring停留在j (rings[j] 必须和 keys[i] 相同)，steps(k, j)表示ring从k转到j所需要的最少步数，最后还要+1，表示吟唱当前字符所需要的额外步骤。</p>



<p>边界条件：对于第0个字符，ring一开始停留在第0个字符，最小步数就是1 + steps(0, key[0])。</p>



<p>时间复杂度：O(mn<sup>2</sup>)<br>空间复杂度：O(mn) 可以降维到 O(n)</p>



<pre class="urvanov-syntax-highlighter-plain-tag">class Solution {
public:
  int findRotateSteps(string ring, string key) {
    const int n = ring.size();
    const int m = key.size();
    auto steps = [n](int i, int j) {
      return min(abs(i - j), n - abs(i - j));
    };
    // dp[i][j] min steps to spell key[0~i] and ring[j] is at 12:00.
    vector&lt;vector&lt;int&gt;&gt; dp(m, vector&lt;int&gt;(n, INT_MAX/2));
    for (int i = 0; i &lt; m; ++i)
      for (int j = 0; j &lt; n; ++j) {
        if (ring[j] != key[i]) continue;
        for (int k = 0; k &lt; n; ++k)
          dp[i][j] = min(dp[i][j], 1 + (i == 0 ? steps(0, j) : (dp[i - 1][k] + steps(j, k))));
      }
    return *min_element(begin(dp.back()), end(dp.back()));
  }
};</pre>
]]></content:encoded>
					
					<wfw:commentRss>https://zxi.mytechroad.com/blog/dynamic-programming/leetcode-514-freedom-trail/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
