演算法 動態規劃

2021-09-26 14:40:07 字數 3058 閱讀 4920

二、動態規劃經典例題

暴力搜尋:一般使用暴力遞迴

記憶搜尋:將每次遞迴的結果放在hashmap中,下次遞迴的時候去hash表中查詢結果,有,使用記憶的結果,沒有則再進行遞迴。記憶搜尋不規定計算的順序。

經典的動態規劃方法:動態規劃規定記憶的順序。

演算法:

暴力搜尋:

public class find ;

system.out.println(process1(ints, 0,100));

}public static int process1(int arr,int index,int aim)

return res;

}}

記憶搜尋:

public class find ;

system.out.println(coins1(ints,100));

}public static int coins1(int arr,int aim)

public static int process1(int arr,int index,int aim, int map) else else }}

return res;

}}

參考:動態規劃演算法案例分析

public class find ;

system.out.println(getcount(ints,3,100));

}public static int getcount(int penny,int n, int aim) }}

return dp[n-1][aim];

}}

暴力搜尋:

public class literator 

public static int method(int i)

if(i == 1)

if(i == 2)

else

}}

public class literator ,,,};

system.out.println(method(array, 3, 3));

}public static int method(int array, int row, int cow)

for (int i = 1; i < array.length; i++)

for (int i = 1; i < array.length; i++)

}return dp[row][cow];

}}

思路

注意:是以array[i]為結尾的最大子串行長度,那就是比他小的array[j]中選出最大的test[j]值再加1。

public class literator ;

system.out.println(method(array));

}public static int method(int array)

}compare[i] = flag + 1;

}int flag = 0;

for (int i = 0; i < compare.length; i++)

}return flag;

}}

思路:

public class literator 

public static int method(string str1, string str2)else

for (int i = 1; i < n; i++)

for (int i = 1; i < m; i++)

for (int i = 1; i < n; i++)

int flag2 = 0;

if(str1.charat(i) == str2.charat(j)) else

if(flag2 > flag)else }}

return array[n - 1][m - 1];

}}

dp[x][y]代表前x件物品,不超過重量y的時候的最大價值

思路:第x件物品的情況:

1.拿第x件物品,則前x-1件物品的重量不超過:y-w[x]

2.不拿第x件物品,則前x-1件物品的重量不超過y

dp[x][y] = 中的最大值

public class literator ;

int weight = ;

system.out.println(method(value, weight, 80));

}public static int method(int value, int weight, int aim) }}

return dp[row-1][aim];

}}

舉例:

str1=「abc」 str2=「adc」 ic=5 dc=3 rc=2,從"abc"編輯到"adc"把b替換成d代價最小,為2;

str1=「abc」 str2=「adc」 ic=5 dc=3 rc=10,從"abc"編輯到"adc",先刪除b再插入d代價最小,為8;

思路:

package com.example.demo;

public class literator

public static int method(string str1, string str2,int ic, int dc, int rc)

for (int i = 1; i < line + 1; i++)

for (int i = 1; i < row + 1; i++)

if(str1.charat(i-1) != str2.charat(j-1))

}else

}array[i][j] = flag;}}

return array[row][line];

}}

演算法 動態規劃

動態規劃 把多階段過程轉化為一系列單階段問題,利用各階段之間的關係,逐個求解 演算法例子 1.鋼條切割 serling 公司購買長鋼條,將其切割為短鋼條,切割工序假設沒有成本支出,公司管理層希望確定最佳的切割方案。假設serling公司 一段長度為i英吋的鋼條的 為pi。鋼條的長度為整英吋,下表給出...

演算法 動態規劃

1 問題具有最優子結構性質。如果問題的最優解所包含的子問題的解也是最優的,我們就稱該問題具有最優子結構性質。比如說在揹包問題中,最高總價值 max 選擇不放該物品時達到的總價值,決定放該物品時揹包剩餘容量能達到的最大價值 該物品價值 顯然,最高總價值的解一定包含 選擇不放該物品時達到的總價值 和 決...

演算法 動態規劃

動態規劃的定義 動態規劃是運籌學的乙個分支,是求解決策過程的最優化的數學方法。20世紀50年代初美國數學家r.e.bellman等人在研究多階段決策過程的優化問題時,提出了著名的最優化原理,把多階段過程轉化為一系列單階段問題,利用各階段之間的關係,逐個求解,創立了解決這類過程優化問題的新方法 動態規...