zoukankan      html  css  js  c++  java
  • DP算法学习

    遇到好多问题都在说DPDPDP啊啊啊,好苦恼自己多看看。无非分三步一步一步熟悉就好啦!

    原文:http://blog.sina.com.cn/s/blog_50eaa92f0100c8t7.html

    动态规划算法的有效性依赖于待求解问题本身具有的两个重要性质:最优子结构性质和子问题重叠性质。

    1、最优子结构性质。如果问题的最优解所包含的子问题的解也是最优的,我们就称该问题具有最优子结构性质(即满足最优化原理)。最优子结构性质为动态规划算法解决问题提供了重要线索。

    2、子问题重叠性质。子问题重叠性质是指在用递归算法自顶向下对问题进行求解时,每次产生的子问题并不总是新问题,有些子问题会被重复计算多次。动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只计算一次,然后将其计算结果保存在一个表格中,当再次需要计算已经计算过的子问题时,只是在表格中简单地查看一下结果,从而获得较高的解题效率。

    当我们已经确定待解决的问题需要用动态规划算法求解时,通常可以按照以下步骤设计动态规划算法:

    1、分析问题的最优解,找出最优解的性质,并刻画其结构特征;

    2、递归地定义最优值;(方便提高逻辑性和节省时间)

    3、采用自底向上的方式计算问题的最优值;(自底而上能够大大减少不必要的重复和提高效率节省时间)

    4、根据计算最优值时得到的信息,构造最优解。

    1~3步是动态规划算法解决问题的基本步骤,在只需要计算最优值的问题中,完成这三个基本步骤就可以了。如果问题需要构造最优解,还要执行第4步;此时,在第3步通常需要记录更多的信息,以便在步骤4中,有足够的信息快速地构造出最优解。

    记下DP第一题:hdu1003

    http://acm.hdu.edu.cn/showproblem.php?pid=1003

    代码:

    #include<stdio.h>
    int a[100010];
    int dp[100010];
    int main()
    {
    int n,i,t;
    int qq=1;
    scanf("%d",&t);
    while(t--)
    {
    int start,end,maxu,j1,j2;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    scanf("%d",&a[i]);
    dp[0]=a[0];
    j1=j2=start=end=0;
    maxu=-100000;
    for(i=0;i<n;i++)
    {
    if(dp[i-1]+a[i]>=a[i])
    {
    dp[i]=dp[i-1]+a[i];
    end=i;
    }
    else
    {
    dp[i]=a[i];
    start=i;
    end=i;
    }
    if(maxu<dp[i])
    {
    maxu=dp[i];
    j1=start;
    j2=end;
    }
    }
    printf("Case %d: ",qq++);
    printf("%d %d %d ",maxu,j1+1,j2+1);
    if(t!=0)
    printf(" ");

    }
    }

  • 相关阅读:
    2018-06-20 利用随机数组进行36选7(不重复)
    2018-06-20 js字符串函数
    2018-06-19 js DOM对象
    2018-06-19 Javascript 基础2
    《我们应当怎样做需求分析》阅读笔记
    《软件需求模式》阅读笔记03
    《软件需求模式》阅读笔记02
    《软件需求模式》阅读笔记01
    java总结:double取两位小数的多种方法
    梦断代码阅读笔记03
  • 原文地址:https://www.cnblogs.com/kobeshegu/p/kobeshegu.html
Copyright © 2011-2022 走看看