zoukankan      html  css  js  c++  java
  • 动态规划(Dynamic Programming)

    introduction

    大部分书籍介绍“动态规划”时,都会从“菲波纳切数列”讲起。

    菲波纳切数列

    递归解法

    C++ 代码如下

    unsigned long int fib(const int n) {
    	switch (n)
    	{
    	case 0:
    		return 0;
    	case 1:
    		return 1;
    	default:
    		return fib(n - 1) + fib(n - 2);
    	}
    }
    

    DP

    解决 DP 问题的关键因素之一,是要找出问题递归方程,然后就好解了。
    菲波纳切数列的递归定义如下:

    纯 DP

    自底向上,使用数组存储过程值。

    unsigned long int fib(const int n) {
    	vector<unsigned long int> sum;
    	sum.push_back(0);
    	sum.push_back(1);
    
    	for (int i = 2; i <= n; i++) {
    		sum.push_back(sum[i - 1] + sum[i - 2]);
    	}
    
    	return sum[n];
    }
    

    优化 DP

    自底向上,但是没有使用数组存储过程值——不记录全局解(过程值)的 DP 算法,其本质就类似于贪心算法了。

    unsigned long int fib(const int n) {
    	switch (n)
    	{
    	case 0:
    		return 0;
    	case 1:
    		return 1;
    	}
    
    	unsigned long int a = 0, b = 1, sum = 0;
    	for (int i = 2; i <= n; i++) {
    		sum = a + b;
    		a = b;
    		b = sum;		
    	}
    
    	return sum;
    }
    

    经典 DP 题解

    最大连续子数组和问题

    递归方程

    curr(i) = max(0, curr(i-1)) + arr[i]
    
    如果 curr > result ,则更新 result = curr,否则 result 保持原值
    

    解题代码

    int maxSubArray(const vector<int> &v) {
    	int curr = 0;
    	int ret = v[0];
    
    	for (auto e : v) {
    		if (curr >= 0) {
    			curr += e;
    		}
    		else {
    			curr = e;
    		}
    
    		ret = curr > ret ? curr : ret;
    	}
    
    	return ret;
    }
    
    
  • 相关阅读:
    Genymotion安装与集成开发指南
    近期遇到的Android问题解决与总结
    关于Android Studio乱码的解决办法
    菜鸟程序员如何才能快速提高自己的技术
    android不能调试解决方法
    导入工程出现@Override错误
    读取本地文件的权限问题
    混合app开发
    JNI 实战全面解析
    Android性能优化
  • 原文地址:https://www.cnblogs.com/fengyubo/p/5589434.html
Copyright © 2011-2022 走看看