Kadane 的算法是贪婪算法还是优化 DP 算法?

2024-01-26

我觉得 Kadane 算法是最大子数组问题的真正动态规划解决方案的修改版本。为什么我有这样的感觉? 我觉得因为计算最大子数组的方法可以采取:

for(i=0;i<N;i++)
    {
        DP[i][A[i]]=true;
        for(j= -ve maximum ;j<= +ve maximum ;j++)
        if(DP[i-1][j])
            DP[i][j+A[i]]=true;
    }

递归式是如果是可以组成 j 并以 i-1 结尾的子数组我可以形成的元素j+A[i]使用第 i 个元素并形成A[i]单独在第 i 个位置开始一个子数组 最后我们可以在这个 DP 数组中搜索标记为 true 的最大 j!

Note : DP[i][j]表示是否可以使用以 i 结尾的子数组来生成 j!这里我假设 j 也可以是负数。!现在我们可以很容易地导出 sum+ 一个负数 i-1th 位置并将其连接到i thelement 这让我觉得这是一种贪婪的选择(只是因为最大值+元素给了我一个最大值)。

NOTE:我现在还没有研究过贪婪算法,但我知道什么是贪婪选择!

编辑:有人说我的算法没有任何意义,所以我试图发布我的代码以使自己清楚。我没有把 j 作为 -ve,因为它们没有成果。 我重复一遍,我的状态被定义为是否可以使用以 i 结尾的子数组来生成 j。

#include<bits/stdc++.h>
using namespace std;
int DP[101][101];
int main()
{
    int i,j,ans=INT_MIN;
    int A[]={3,-1,2,-1,5,-3};
    int N=sizeof(A)/sizeof(int);
    for(i=1;i<=N;i++)
    {
        if(A[i-1]>=0)
            DP[i][A[i-1]]++;
        for(j=0;j<=100;j++)
        {
            if(DP[i-1][j])
            {
                if(j+A[i-1]>=0)
                    DP[i][j+A[i-1]]++;
            }
            if(DP[i][j])
                ans=max(ans,j);
        }
    }
    cout<<ans<<"\n";
    return 0;
}

Output 8


Kadane 是一种迭代动态规划算法。

优化迭代 DP 算法以沿着算法级数的主轴移除 DP 矩阵的一维是很常见的。

例如,通常的“最长公共子序列”算法通常用 2D 矩阵来描述,但如果算法从左到右进行,那么您实际上只需要 2 列的空间。

Kadane 的算法是应用于一维问题的类似优化,因此整个 DP 数组消失。由于某种原因,您问题中的 DP 代码具有 2D 矩阵。我不知道为什么——这确实没有意义。

这个网站很好地解释了推导过程:https://hackernoon.com/kadanes-algorithm-explained-50316f4fd8a6 https://hackernoon.com/kadanes-algorithm-explained-50316f4fd8a6

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Kadane 的算法是贪婪算法还是优化 DP 算法? 的相关文章

  • 如何使用 python 有效地找到两个大文件的交集?

    我有两个大文件 它们的内容如下所示 134430513125296589151963957125296589 该文件包含未排序的 id 列表 某些 id 可能会在单个文件中出现多次 现在我想找到路口两个文件的一部分 这就是两个文件中都出现的
  • 找到一个数是素数,为什么检查到n/2更好。避免n后半部分的数字的原因是什么

    要检查一个数是否是素数 最简单的方法是尝试将这个数除以 2 到 n 如果任何操作得到余数为 0 那么我们就说给定的数不是素数 但最好只进行划分和检查直到 n 2 我知道更好的方法是直到 sqrt n 我想知道跳过后半部分的原因 假设我们是否
  • 在矩阵/位图中查找质量簇

    这是此处发布的问题的延续 在 2D 位图上查找质心 https stackoverflow com questions 408358 finding the center of mass on a 2d bitmap正如给出的例子 它讨论了
  • 用于计算有向图上非循环路径数量的快速算法

    简而言之 我需要一个fast计算简单有向图中有多少条非循环路径的算法 By simple我的意思是没有自环或多重边的图 Apath可以从任何节点开始 并且必须在没有传出边的节点上结束 一条路径是acyclic如果没有边出现两次 我的图 经验
  • 优化两个三位数乘积的最大回文数?

    我正在研究一个面试问题 我被问到这个问题 我应该编写一个程序 从两个三位数的乘积中找到最大的回文数 这里是question https projecteuler net problem 4 我想出了这种从底部开始的蛮力方法 public c
  • 比 BMH (Boyer–Moore–Horspool) 更快的算法

    您会使用哪种算法来搜索短文本中的短子字符串 简而言之 我的意思是子字符串有 5 10 个字符 字符串有 255 个字符 我正在考虑根据输入数据长度选择算法 哪种算法对于较长的输入更好 Try Turbo BM http www igm un
  • 查找一个二维矩阵是否是另一个二维矩阵的子集

    最近我参加了一个黑客马拉松 我了解到一个问题 试图在 2d 矩阵中找到网格形式的模式 模式可以是 U H 和 T 并由 3 3 矩阵表示 假设我想展示 H 和 U 1 0 1 1 0 1 1 1 1 gt H 1 0 1 gt U 1 0
  • 基于 2 个输入的伪随机数生成器 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我需要根据 2 个输入值 X 和 Y 生成一个伪随机数 给定相同的 X 和 Y 值 我需要得到相同的结果 结果应介于 0 和 1 之间 含
  • 关于逻辑/算法的想法以及如何防止线程写入 Sql Server 中的竞争

    我有以下逻辑 public void InQueueTable DataTable Table int incomingRows Table Rows Count if incomingRows gt RowsThreshold async
  • 最接近 x,y 的线上的点[重复]

    这个问题在这里已经有答案了 可能的重复 如何判断一个点是否在某条线附近 https stackoverflow com questions 910882 how can i tell if a point is nearby a certa
  • 字符串的渐进单词组合

    我需要获得字符串的渐进单词组合 例如 这是字符串 输出 这是字符串 这是 这个字符串 是字符串 这 是 细绳 你知道类似的算法吗 我需要php语言 谢谢 这是解决您问题的简单代码 我将每个字符串递归地连接到数组中的其余字符串 string
  • 逐字遍历句子

    如何逐字遍历任何给定的句子 java中有内置函数吗 我不知道如何开始 像这样的事情 String sentence Your sentence here String words sentence split s splits by whi
  • 查找重叠事件/时间的算法

    在处理自定义日历时 我不知道如何找到与任何其他时间段重叠的时间段 时段从 0 点至 720 点 上午 9 点至晚上 9 点 每个像素代表一分钟 var events id 1 start 0 end 40 an event from 9 0
  • 如何确定字符串的最小公约数?

    我在面试时被问到以下问题 并被它难住了 我遇到的部分问题是要下定决心要解决什么问题 起初我并不认为这个问题在内部是一致的 但后来我意识到它要求你解决两个不同的问题 第一个任务是弄清楚一个字符串是否包含另一个字符串的倍数 但第二个任务是在两个
  • 随机排列

    我无法找到一种随机洗牌元素的好方法std vector经过一些操作后 恢复原来的顺序 我知道这应该是一个相当简单的算法 但我想我太累了 由于我被迫使用自定义随机数生成器类 我想我不能使用std random shuffle 无论如何这没有帮
  • java中的Anagram算法

    我想做字谜算法但是 这段代码不起作用 我的错在哪里 例如 des 和 sed 是字谜 但输出不是字谜 同时我必须使用字符串方法 不是数组 public static boolean isAnagram String s1 String s2
  • 加权图的 BFS 算法 - 寻找最短距离

    我看过很多帖子 即 post1 https stackoverflow com questions 30409493 using bfs for weighted graphs post2 https cs stackexchange co
  • 计算总和等于 k ​​的子集数量

    给定一个数组 我们需要找出总和恰好等于给定整数 k 的子集的数量 请针对这个问题提出一个最佳算法 这里不需要实际的子集 只需计数即可 该数组由整数组成 可以是负数也可以是非负数 例子 数组 gt 1 4 1 10 5 绝对值总和 gt 9
  • 让电脑实现360度=0度,旋转炮塔

    我正在制作一个游戏 其中有一个计算机控制的炮塔 炮塔可360度旋转 它使用 trig 找出枪瞄准所需的角度 obj deg 并将枪的当前角度存储在 gun deg 下面的代码以设定的速度旋转枪 if objdeg gt gundeg gun
  • RNG 技术的可移植性和可重复性

    我可以使用两种方法之一来创建一个伪随机数序列 该序列具有两个重要特征 1 它可以在不同的机器上重现 2 该序列永远不会重复范围内的数字 直到所有数字都被发出 我的问题是 这两种方法在可移植性 操作系统 Python 版本等 方面是否存在潜在

随机推荐

  • 将多次出现的特殊字符替换为单个特殊字符

    我想删除多次出现的特殊字符 例如 从我的 java 字符串中通过一个下划线 我试过 replaceAll s 1 它似乎用下划线替换连续的相同类型的特殊字符 但否则不起作用 例如 Hello World becomes Hello Worl
  • 如何使用货币轨显示带有符号的价格

    鉴于这个简单Money对象查询 Money new 1000 USD to s gt 10 00 如何用其符号显示该值 我知道我可以打电话money object symbol但有些货币将符号放在值之前 而另一些货币则将符号放在值之后 我很
  • 如何获取ViewFlipper当前的子位置

    我已将一堆图像添加到 ViewFlipper 现在我正在 Flipper 中执行 onClick 事件 为此 我想知道当前的子位置 以便我可以在数组中执行一些操作 无论如何 有没有办法找出当前孩子的位置 使用它来获取当前的子位置 flipp
  • 离线网络应用程序加载时内容会消失几分之一秒

    我在 iOS 4 3 到 5 0 上观察到了这一点 当您创建一个简单的离线 Web 应用程序时 即一个 HTML 文件 一些资源 例如 CSS 和 JS 全部存在于缓存清单中 它可以离线工作 我在飞行模式下进行了测试 BUT 当您将这样的应
  • SDL_GetKeyboardState 不起作用

    我正在尝试使用 SDL 2 为游戏制作一个控制器 不想询问 gamedev 因为这不是直接的游戏问题 我使用 SDL GetKeyboardEvent 来查看导航箭头是否被按下 但它显然不起作用 如果按下其中一个键 它应该打印值 1 或 1
  • 使用 Cloud SDK CLI One-Liner 获取默认 GCP 项目 ID

    我正在寻找一个gcloud一行代码获取默认项目 ID GCP PROJECT ID The list命令给了我 gcloud config list core project gt core project GCP PROJECT ID Y
  • Logcat 显示空 SMPTE 2094-40 数据

    当我将设备连接到 android studio logcat 时 它不断显示此消息 Empty SMPTE 2094 40 data 有谁知道这是从哪里来的或如何阻止它 在Android Studio中 尝试使用这个过滤器 package
  • @storybook/Angular 无法在故事索引上加载 scss 文件

    我一直在尝试在我的角度项目中使用故事书 并且我使用本指南https storybook js org basics guide angular https storybook js org basics guide angular 我将推荐
  • 从 TimeSpan 小时计算天数

    我有 1 个文本框 用户将在其中输入小时数 目前 如果输入 26 小时 由于 TimeSpan 的 HH 限制 我们会收到错误 该值将存储在 SQL Server 2008 Time 7 字段中 我怎样才能让它识别超过23小时 不能选择将其
  • 127.0.0.1、0.0.0.0 和 localhost 有什么不同?

    我不明白这些术语之间的区别以及它们之间的联系 我查看了计算机上的主机文件 可以看到 127 0 0 1 和 localhost 已连接 但不确定如何连接 也不知道 0 0 0 0 适合所有这些 我已经看到了这个问题的其他答案 但我是新手 关
  • 为什么 Eclipse 以红色突出显示我的代码以及如何将其关闭? [复制]

    这个问题在这里已经有答案了 为什么 Eclipse 以红色突出显示我的代码以及如何将其关闭 版本 光子发布 4 8 0 这是由于代码覆盖率而被激活的 如果您想删除它 请按照以下步骤操作 转到 Windows gt 显示视图 gt 覆盖范围
  • 带模板的 N 维嵌套金属循环

    我正在尝试使用模板元编程进行 N 维嵌套金属循环 嵌套部分很简单 但是将所有任意数量的迭代索引作为模板参数传递到最内层循环似乎有问题 一个简单的未嵌套的金属环看起来像 template
  • 如何保存sql中的最后一个检查点以用于下一行

    有什么方法可以存储最后一次迭代的行结果并将其用于下一行迭代吗 例如我有一张桌子说 Time Table Key type timeStamp 1 1 B 2015 06 28 09 00 00 2 1 B 2015 06 28 10 00
  • 关于 Django 的问题:显示多对多字段

    当 Django 在模板中渲染 ManyToManyField 时 我似乎遇到了问题 我可以让它部分工作 但我不能让它按照我想要的方式正常工作 首先 我有一个发票模板 它显示我的数据库中的发票详细信息 invoice details htm
  • 在 Ruby 中,如果我们定义“c=(foo)”并且它返回 foo + 1,为什么它没有分配给 d = (self.c = 3)?

    代码是 def c foo p hello return foo 1 end p self c 3 d self c 3 p d 它只会打印出 3 换句话说 返回值 4 没有分配给d why Setter 总是返回他们的参数 或正确的操作数
  • 为什么这个应用程序被拒绝?

    苹果拒绝了这个应用程序 甚至在解决中心提供了很长的解释 但我不确定为什么 有人可以帮我翻译一下吗 2 23 我们发现您的应用程序不遵循iOS数据存储 指南 这是 App Store 审核指南所要求的 特别是 我们发现在启动和 或内容下载时
  • 研究在 tkinter 中单击按钮后返回按钮文本的方法[重复]

    这个问题在这里已经有答案了 我正在尝试创建一个使用此 lambda 函数单击的按钮列表 button1 config command lambda x clicked append x button1 cget text 它似乎有点工作 但
  • 如何更改企业项目的上下文路径

    所以我的企业项目名称TestProject 其中包含TestProject ejb and TestProject war 所以当我运行该项目时 网址是这样的locahost 8080 TestProject war 我怎样才能改变这个网址
  • css div之间的垂直间隙

    我知道这是一个常见问题 但我似乎找不到有效的解决方案 我有这样的设置 div div class content area top div div class content area h1 Title h1 some other text
  • Kadane 的算法是贪婪算法还是优化 DP 算法?

    我觉得 Kadane 算法是最大子数组问题的真正动态规划解决方案的修改版本 为什么我有这样的感觉 我觉得因为计算最大子数组的方法可以采取 for i 0 i