动态规划初阶

2017-05-27  本文已影响0人  crazydane

动态规划算法通常基于一个转移方程及一个或多个初始状态。 当前子问题的解将由上一次子问题的解推出。使用动态规划来解题只需要多项式时间复杂度, 因此它比回溯法、暴力法等要快许多。

动态规划通常包含最优子结构——如果一个问题的最优解包含了子问题的最优解。

Question 1: 如果我们有面值为1元、3元和5元的硬币若干枚,如何用最少的硬币凑够11元?

用d(i)=j来表示凑够i元最少需要j个硬币。我们可以推断:

#python
def getMinCoins(value,coins):
    if value<=0:
        return 0
    results=[]
    for coin in coins:
        if value-coin>=0:
            results.append(getMinCoins(value-coin,coins))
    return min(results)+1
coins = [1,3,5]
print(getMinCoins(3,coins))  #ouput = 1
print(getMinCoins(4,coins))  #ouput = 2
print(getMinCoins(11,coins)) #ouput = 3
Java版
public class Main {
    public static void main(String[] args) {
        int[] coins = {1,3,5};
        System.out.println(getMinCoins(3,coins));
        System.out.println(getMinCoins(4,coins));
        System.out.println(getMinCoins(11,coins));
    }
    public static int getMinCoins(int value, int[] coins){
        //程序的出口
        if(value<=0){
            return 0;
        }
        ArrayList results= new ArrayList<Integer>();
        for(int i = 0; i<coins.length;i++){
            if(value-coins[i]>=0)
                results.add(getMinCoins(value-coins[i],coins));
        }
        Collections.sort(results);
        return (int) results.get(0)+1;
    }
}

这里要注意:ArrayList排序的方法

Collections.sort(results);

Question 2 :一个序列有N个数:A[1],A[2],…,A[N],求出最长非降子序列(LIS)的长度。

假设序列为:

 5,3,4,8,6,7
d(i) = max{1, d(j)+1},其中j<i,A[j]<=A[i]
#python
def getLIS(list,n):
    if n <=0:
        return 1
    result = [0]
    for i in range(0,n):
        if list[i] < list[n]:
            result.append(getLIS(list,i))
    return max(result)+1

list = [5,3,4,8,6,7]
print(getLIS(list,5))  #ouput is 4
上一篇 下一篇

猜你喜欢

热点阅读