zoukankan      html  css  js  c++  java
  • 动态规划算法--理解

    一、含义

    动态规划:多阶段(两段)最优化决策解决问题的过程就称为动态规划。

    二、基本步骤

    1、描述优解的结构特征。 

    2、递归地定义一个最优解的值。 

    3、自底向上计算一个最优解的值。

    4、从已计算的信息中构造一个最优解。

    三、何时采用动态规划

    (1) 最优化原理:问题的最优解包含的字问题也有最优解,就称该问题具有最优子结构,满足最优化原理。

    (2)有重叠子问题:即子问题之间是不独立的,一个子问题在下一阶段决策中可能被多次使用到。(处理重叠子问题是动态规划的优势所在)

    四、例题

    单调递增最长子序列

    设计一个O(n2)时间的算法,找出由n个数组成的序列的最长单调递增子序列。

    输入格式:

    输入有两行: 第一行:n,代表要输入的数列的个数 第二行:n个数,数字之间用空格格开。

    输出格式:

    最长单调递增子序列的长度。

    输入样例:

    5
    1 3 5 2 9

    输出样例:

    4

    代码:

     1      int[] a = new int[100];
     2      int []dp =new int[100]; 
     3      int n;
     4      Scanner inputScanner = new Scanner(System.in);
     5         n = inputScanner.nextInt();
     6         for (int i = 0; i < n; i++) {
     7             a[i] = inputScanner.nextInt();
     8         }
     9         for (int i = 0; i < dp.length; i++) {
    10              dp[i] = 1;
    11         }
    12         int max =0;
    13         for (int i = 1; i < a.length; i++) {
    14             for (int j = 0; j <= i; j++) {
    15                 if (a[i]>a[j]) {
    16                     dp[i] = Math.max(dp[i], dp[j]+1);//更新max
    17                     max=dp[i];
    18                 }    
    19             }
    20         }
    21         System.out.println(max);
    22         inputScanner.close();

     租用游艇问题

    长江游艇俱乐部在长江上设置了n个游艇出租站1,2,…,n。游客可在这些游艇出租站租用游艇,并在下游的任何一个游艇出租站归还游艇。游艇出租站i到游艇出租站j之间的租金为r(i,j),1<=i<j<=n。试设计一个算法,计算出从游艇出租站1 到游艇出租站n所需的最少租金。

    输入格式:

    第1 行中有1 个正整数n(n<=200),表示有n个游艇出租站。接下来的第1到第n-1 行,第i行表示第i站到第i+1站,第i+2站, ... , 第n站的租金。

    输出格式:

    输出从游艇出租站1 到游艇出租站n所需的最少租金。

    输入样例:

    3
    5 15
    7

    输出样例:

    12

    代码:

    #include <iostream>
    using namespace std;
    
    int main(){
        int a[100][100];
        int i=0,j=0,k,n;
        cin>>n;
        for(i=1;i<n;i++) {
            for(j=i+1;j<=n;j++) {
                cin>>a[i][j];
            }
        }
        for(i=2;i<n;i++){
            for (j=i+1; j<=n; j++) {
                k = j-i;//表示从第K站到第j站找一站p使得a[k][p]+a[p][j]最小。
    for (int p=k; p<j; p++) {
                    if (a[k][p]+a[p][j]<a[k][j]) {
                        a[k][j]=a[k][p]+a[p][j];
                    }
                }
            }
        }
        cout<<a[1][n]<<endl;
        return 0;
    }
    Linux等环境软件安装
  • 相关阅读:
    区块链分布式云存储项目盘点
    区块链一定要知道的的七大认识误区
    以太坊“空块”数量激增有什么影响?
    区块链技术涉及哪些编程语言?
    一文读懂实用拜占庭容错(PBFT)算法
    清除浮动的影响
    滚动条
    分享侧栏例子
    最最最简单的轮播图(JQuery)
    3D动画
  • 原文地址:https://www.cnblogs.com/Adam-Ye/p/9851851.html
Copyright © 2011-2022 走看看