网站位置: turnitin/查重 /当前页面

动态规划代码查重

点赞:47131 浏览:91517 更新时间:2024-04-08 投稿人:原创本站原创

论文查重入口服务承诺严格遵守文献保密规定,用户送检文献仅用作检测分析,无其他商业运作行为,保障用户送检文献及检测报告的使用安全!

该文章是文章相似度类有关的方法,对您的论文查抄袭有指导价值。

一、Python之动态规划算法

动态规划算法中是将复杂问题递归分解为子问题,通过解决这些子问题来解决复杂问题。与递归算法相比,动态编程减少了堆栈的使用,避免了重复的计算,效率得到显著提升。

先来看一个简单的例子,斐波那契数列。

斐波那契数列的定义如下。

斐波那契数列可以很容易地用递归算法实现。

上述代码,随着n的增加,计算量呈指数级增长,算法的时间复杂度是 。

采用动态规划算法,通过自下而上的计算数列的值,可以使算法复杂度减小到 ,代码如下。

下面我们再看一个复杂一些的例子。

这是小学奥数常见的硬币问题: 已知有1分,2分,5分三种硬币数量不限,用这些硬币凑成为n分钱,那么一共有多少种组合方法。

我们将硬币的种类用列表 coins 定义;

将问题定义为一个二维数组 dp,dpamtj 是使用 coins 中前 j1 种硬币( coins0:j1 )凑成总价amt的组合数。

例如: coins = 1,2,5 。

dp51 就是使用前两种硬币 1,2 凑成总和为5的组合数。

对于所有的 dp0j 来说,凑成总价为0的情况只有一种,就是所有的硬币数量都为0。所以对于在有效范围内任意的j,都有 dp0j 为1。

对于 dpamtj 的计算,也就是使用 coins0:j1 硬币总价amt的组合数,包含两种情况计算。

1.当使用第j个硬币时,有 dpamtcoinsjj 种情况,即amt减去第j个硬币币值,使用前j1种硬币的组合数。

2.当不使用第j个硬币时,有 dpamtj1 种情况,即使用前j种硬币凑成amt的组合数。

所以: dpamtj = dpamt coinsjjdpamtj1 。

我们最终得到的结果是:dpamount1。

上述分析省略了一些边界情况。

有了上述的分析,代码实现就比较简单了。

动态规划算法代码简洁,执行效率高。但是与递归算法相比,需要仔细考虑如何分解问题,动态规划代码与递归调用相比,较难理解。

我把递归算法实现的代码也附在下面。有兴趣的朋友可以比较一下两种算法的时间复杂度有多大差别。

上述代码在Python 3.7运行通过。

二、动态规划求背包问题伪代码讲解

开一个bool数组f,fij表示是否可以用前i件物品[刚好]占用j的容量,初始化f0..n

1..s=false,f00=true。然后:

for i=1 to n

for j=wi to s

fij=fi1j or fi1jwi;

最后输出结果只需看fns是否为true,为true则存在可行解,否则不存在。

输出解集的方法就是再开一个数组g,gij记录当前位是选择了物品i还是没有选择物品i,这样完整的代码如下:

DP

for i=1 to n

for j=wi to s

if fi1j==true

fij=true,gij=false;

else if fi1jwi==true

fij=true,gij=true;

output

j=s;i=n;

while i>=1

{

if gij==true

输出物品i,j=jwi,i=i1;

else

不用输出物品i,i=i1;

}

不知道您能不能看懂,输出解集部分跟普通的01背包是一样的,建议您参考背包九讲,如果认为我写的不清楚欢迎提问。希望能帮到您。

三、用动态规划法求两个字符串X=acbccb和Y=cacaca的最长公共子序列

动态规划代码查重

设字符串x的长度为nx,字符串y的长度为ny,可新建二维数组dpnx1ny1。

dpij表示x的前i个字符x0:i1与y的前j个字符y0:j1之间最长公共子序列的长度。

那么边界情况当i==0或j==0时,dpij=0。

对于dpij,若xi1==yj1,在它们之前最长公共子序列dpi1j1的基础上。

再加上当前1个字符,即为新的最长公共子序列的长度,所以dpij=dpi1j11。

若xi1!=yj1,则当前最长公共子序列的长度,继承自之前最长公共子序列的长度。

即要么是dpi1j,要么是dpij1,取两者较大值即可。

令i从1遍历到nx,j从1遍历到ny,根据以上递推关系即可得出dp数组的每个元素。

最终dpnxny即为nx长的字符串x与ny长的字符串y之间最长公共子序列的长度。

因为遍历了二维数组的所有元素,所以算法的时间复杂度为O(nxny)。

具体的C代码和运行结果如下。

所给两个字符串的最长公共子序列应为"abcaa",长度为5,与输出结果相符,望采纳。

附源码。

#include <iostream>。

#include <string>。

using namespace std。

int main() {。

string x = "acbccbaa", y = "cabbcaca"。

int nx = x.length(), ny = y.length()。

int dpnx 1ny 1; 保存最长公共子序列长度。

for (int i = 0; i <= nx; i)。

dpi0 = 0; 边界赋值。

for (int j = 0; j <= ny; j)。

dp0j = 0; 边界赋值。

for (int i = 1; i <= nx; i) {。

for (int j = 1; j <= ny; j) {。

if (xi 1 == yj 1)。

dpij = dpi 1j 1 1。

else。

dpij = max(dpi 1j, dpij 1)。

}。

}。

cout << dpnxny << endl; 结果输出。

return 0。

}。

四、求用动态规划的方法求解简单的整数规划问题的matlab程序或者C程序代码,高手们帮帮忙

max Z=4x15x2 6x3

s.t. 3x14x25x3<=10

x1,x2,x3>=0且都为整数

约束条件分析:

x1=1,2,3

x2=1,2

x3=1,2

阶段变量:x1.x2.x3

状态变量:

决策变量:

目标函数:Z=4x15x2 6x3

状态转移方程:

约束条件用惩罚处理

等未完待续等。

此文结论,该文是关于学术不端查重的技巧,免费阅读,为您的检测提供有关的解惑。