- qt - 在 QNetworkAccessManager 中,何时从解析 DNS 的 IP 列表中选择 IP?
- java - OKHTTP——发布用户输入数据,检索 JSON 响应以确定成功
- java - 将 curl 请求转换为 URLConnection
- android - 使用主机名对本地机器的 Http 请求在 android 设备中不起作用
最近我在 https://leetcode.com/problems/palindrome-partitioning-ii/ 上遇到了这个问题:
给定一个字符串s
,划分s
使得划分的每个子串都是回文。
返回对 s
进行回文分割所需的最小切割。
Example:
Input: "aab"
Output: 1
Explanation: The palindrome partitioning ["aa","b"] could be produced using 1 cut.
这是我在互联网上发现的 C 解决方案。我一直试图了解 DP 数组在跟踪什么,我发现在 dp[j]
处,存储了回文分区的数量在 j
字符串的第 th 个字符。所以dp[1]
存储一个字母元素需要的分区数,它永远是0,dp[2]
是strig的前两个字母.
我不明白的是,为什么我们要初始化dp[0] = -1
?这似乎有点不直观,我想不出发生这种情况的原因。
int _min(int a, int b) {
return a < b ? a : b;
}
int minCut(char* s) {
int *dp, n, i, k;
n = strlen(s);
dp = malloc((n + 1) * sizeof(int)); // number of cuts on length
//assert(dp);
dp[0] = -1;
for (i = 0; i < n; i ++) {
dp[i + 1] = dp[i] + 1;
}
for (i = 0; i < n; i ++) {
dp[i + 1] = _min(dp[i + 1], dp[i] + 1);
for (k = 1; // "aba"
i - k >= 0 &&
i + k < n &&
s[i - k] == s[i + k];
k ++) {
dp[i + k + 1] = _min(dp[i + k + 1], dp[i - k] + 1);
}
for (k = 1; // "aaaa"
i - k + 1 >= 0 &&
i + k < n &&
s[i - k + 1] == s[i + k];
k ++) {
dp[i + k + 1] = _min(dp[i + k + 1], dp[i - k + 1] + 1);
}
}
i = dp[n];
free(dp);
return i;
}
我已经用这个函数做了一些追踪,但似乎仍然找不到答案:这是我尝试 minCut("aba") 的地方,在第二次迭代的每个迭代开始时打印 i 和 dp包装 for 循环,以及 k
当它出现在第一个嵌套 for 循环中时。
i = 0
dp = [-1, 0, 1, 2]
i = 1
dp = [-1, 0, 1, 2]
k = 1
i = 2
dp = [-1, 0, 1, 0]
当我们来到元素 'b'
时,通过向前和向后展开,我们发现 "aba"
是一个回文。然后,用这个:dp[i + k + 1] = _min(dp[i + k + 1], dp[i - k] + 1);
,我们得到 dp [3] = _min(dp[3], dp[1 - 1] + 1) = _min(2, -1 + 1) = 0
。
令人困惑的是为什么基本情况是 dp[0] = -1
,以及它如何影响 _min(dp[3], dp[0] + 1)
。基本上我们要回到没有检测到回文的地方并取该值 + 1。但是为什么 minCut("") = -1
?
我已经尝试解决这个问题 2.5 小时了,但我仍然无法解决。
最佳答案
这是一个保护值。当我们不想写额外的 if
时,我们会使用这样的东西,然后我们将一些 guard 元素附加到数据中,例如我们可以使用 (n+2)*(n+2)
矩阵代替 n*n
矩阵,在守卫位置上使用一些方便的值,通常为零。
请注意,每发现一个下一个回文,您就需要再进行一次切割。这是通过 + 1
在更新 dp
时实现的。但是当你发现第一个回文时,你不需要为它做切割。这与棒切割相同,将一根棒切割成一 block 你根本不需要切割它。
顺便说一句,如果 s
的长度为零,程序将返回错误的 -1
。
顺便说一句,如果输入的字符串看起来像aaa...aaa
,这个程序会花费很多时间来运行。基本上,它是 O(n^2)
。
关于c - 回文分区问题中此 DP 数组的基本情况 dp[0] = -1 的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57519121/
我学过这两种DP方式,现在很迷茫。不同情况下我们如何选择?而且我发现在大多数情况下,自上而下对我来说更自然。谁能告诉我如何做出选择。 PS:这篇文章我看过older post但仍然感到困惑。需要帮忙。
我在想是否有某种通用的方法可以将自上而下的动态编程转换为自下而上的编程。 我们能否想出某种机制来提供正式的方式,通过这种方式我们可以将自上而下的 DP 转换为自下而上的 DP。 注意:我是动态规划的初
在我的 xml 中,我在 TextView 上有这个: android:textSize="18dp"(是的,我知道 dp 不适合文本,但这不是重点) 我还有其他一些以编程方式创建的 TextView
假设我正在为屏幕尺寸等于或大于 600dp 的设备开发不同的布局。我想使用 post android 3.2 资源限定符。我创建了一个名为 layout-sw600dp 的文件夹并将我的布局放在那里,
最近我在 https://leetcode.com/problems/palindrome-partitioning-ii/ 上遇到了这个问题: 给定一个字符串s,划分s使得划分的每个子串都是回文。
我已经尝试使用 admob 大约 4 个小时了,现在真的卡住了。我得到: Not enough space to show ad. Needs 320x50 dp, but only has 288
我正在尝试将可变数量的像素计算为与密度无关的像素,反之亦然。 这个公式 (px to dp): dp = (int)(px/(displayMetrics.densityDpi/160)); 不适用于
我正在从头开始创建一个 HTML 页面,并在其中动态放置值,然后将其显示在 WebView 中。 我正在尝试在 WebView(作为 HTML)中复制 ActionBar(出现在应用程序的其他 Act
我正在使用 the 4.17.37 of Bootstrap 3 Datepicker - eonasdan datepicker 我有一个正确显示的内联日期选择器,我只会使用天模式,所以我使用以下代
我正在尝试将智能横幅广告添加到我的 fragment 布局中,但我不断得到的是“没有足够的空间来展示广告。需要 320x50 dp,但只有 309x0 dp”。 这是我的 fragment 布局。
我在关于 http://developer.android.com/guide/practices/screens_support.html 的一些不幸的歧义中迷失了方向,而且我找不到澄清问题的 st
写在前面 $ DP $,是每个信息学竞赛选手所必会的算法,而 $ DP $ 中状态的转移又显得尤为关键。本文主要从状态的设计和转移入手,利用各种方法对朴素 $ DP $ 的时间复杂度和空间复杂度进行
我试图理解一种著名的正则表达式匹配 DP 算法。以防万一,人们不知道这是描述和算法。 '.' Matches any single character. '*' Matches zero or mor
注意:是的,我知道Android中还有其他处理按钮的方法,但这只是一个示例来说明我的问题(实际的按钮要复杂得多)。因此,请不要在为Android中的按钮提供其他解决方案时回信,我正在寻找PaintCo
Closed. This question needs to be more focused。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅关注editing this post的一个问题。
我正在测试 Samsung Galaxy Note 3根据文档,它是 1080 x 1920 像素(~386 ppi 像素密度)。我想弄清楚 dp 中的屏幕宽度 是多少,以便我可以正确应用并检查 ne
所以我现在完全迷路了,当用户通过Accessibility -> Font size 将字体大小时设置为Huge 时,文本大小会破坏我的 UI,所以为了快速修复 我决定将所有文本大小更改为 dp 而不
更新:我发现了我的问题。我已经为不同的分辨率定义了单独的可绘制资源,但我不知道我必须为不同的屏幕尺寸创建不同的布局。我想我应该更全面地阅读“支持多屏幕”页面。遇到此问题的任何其他人,请阅读整个页面:
阅读这篇文章(http://developer.android.com/guide/practices/screens_support.html)后,我在 xml 文件中使用 dp 单元开发了一个完整
该问题需要计算特定成本的硬币变化次数。 例如,如果我有 50, 20, 10, 5, 1 的硬币值(value),我可以形成以下成本: 5 => (5), (11111), 这是2种方式。 10 =>
我是一名优秀的程序员,十分优秀!