前言
动态规划可以优化传统循环所浪费的时间,多理解动态规划,可以提高对题的认知,
提示:以下是本篇文章正文内容,下面案例可供参考
一、动态规划是什么?
动态规划(英语:Dynamic programming,简称 DP),是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质的问题。
二、使用步骤
1.核心思想
动态规划核心思想
动态规划最核心的思想,就在于拆分子问题,记住过往,减少重复计算。
2.基本套路
1 :定义数组,了解数组元素的含义
2 :找出数组的关系
3 :确定初始值
注意: 数组不是必须开辟的,可以优化,这里是方便解题
例题
1: [剑指 Offer 10- II. 青蛙跳台阶问题]
1:递归
超出时间限制了
int num(n){
if(n == 0)
return 1;
if(n == 1 || n == 2)
return n;
else
n = (num(n - 1) + num(n - 2))% 1000000007;
return n;
}
int numWays(int n){
int cnt = num(n);
return cnt ;
}
2 :开一维数组
int num(int n){
int a[101] = {1,1};
int i;
for( i = 2 ; i <= n ; i++)
{
a[i] = (a[i - 1] + a[i - 2]) % 1000000007;
}
return a[n];
}
int numWays(int n){
int cnt = num(n);
return cnt;
}
3:用3 个变量记录
int num(int n){
if(n == 0 || n == 1)
return 1;
int a = 1,b = 1,sum = 0;
for( int i = 2 ; i <= n ; i++)
{
sum = (a + b) % 1000000007;
a = b;
b = sum;
}
return sum;
}
int numWays(int n){
int cnt = num(n);
return cnt;
}
总结
数组优化还需要多练,,就本题时间复杂度可以从O(n)到O(1)
2 :买卖股票的最佳时机
代码
class Solution {
public int maxProfit(int[] prices) {
//tem记录当前利润
int maxProfit = 0 , tem = 0;
int a , b; //a 记录买入价格 b记录卖出价格
a = b = prices[0];
for(int i = 1; i < prices.length; i++)
{
if(a > prices[i]) //如果买入价格大于当前价格 则更新买入和卖出价格
{
a = b = prices[i];
continue;
}
if(b < prices[i]) //卖出价格小于当前价格 ,更新卖出价格和当前利润
{
b = prices[i];
tem = b - a;
}
if(tem > maxProfit)
maxProfit = tem;
}
return maxProfit;
}
}
优化:
省去b,直接代值,调函数!!!!!!
class Solution {
public int maxProfit(int[] prices) {
int maxProfit = 0 ;
int a = prices[0];
for(int i : prices)
{
a = Math.min(a,i);
maxProfit = Math.max(i - a,maxProfit);
}
return maxProfit;
}
}
3 :[不同路径]
代码:
class Solution {
public int uniquePaths(int m, int n) {
int [][] a = new int [m][n];
//初始化第一行 第一列
for(int i = 0; i< m; i++)
{
a[i][0] = 1;
}
for(int j = 0; j < n; j++)
{
a[0][j] = 1;
}
//各元素之间的关系
for(int j = 1; j < m ; j++)
{
for(int i = 1 ; i < n ; i++)
{
a[j][i] = a[j][i - 1] + a[j -1][i];
}
}
return a[m - 1][n -1];
}
}
总结
动态规划还需要进一步了解,目前先总结这些,