动态规划

原创 2016年08月28日 17:43:11


能采用动态规划求解的问题的一般要具有3个性质:

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

    (2) 无后效性:即某阶段状态一旦确定,就不受这个状态以后决策的影响。也就是说,某状态以后的过程不会影响以前的状态,只与当前状态有关。

   (3)有重叠子问题:即子问题之间是不独立的,一个子问题在下一阶段决策中可能被多次使用到。(该性质并不是动态规划适用的必要条件,但是如果没有这条性质,动态规划算法同其他算法相比就不具备优势

基本思想:动态规划算法通常基于一个递推公式及一个或多个初始状态。 当前子问题的解将由上一次子问题的解推出。使用动态规划来解题只需要多项式时间复杂度, 因此它比回溯法、暴力法等要快许多。先求解子问题 保存子问题的解 通过转换方程来 由子问题求解全局问题的解。典型问题有 求最大和子集/最大积子集 解法:http://www.cnblogs.com/bakari/p/4007368.html

典型问题:求最大公共子序列LSC问题

以下是求解combination sum的代码

public static void main(String[] args) {
 int[] can={2,3,6,7};
 List<List<List<Integer>>> d=new ArrayList<List<List<Integer>>>();
// List<List<Integer>> r=new ArrayList<List<Integer>>();
 int t=7;
 for(int i=0;i<=t;i++){
  d.add(i, null);
 }
 for(int i=0;i<=t;i++){
  List<List<Integer>> ll=new ArrayList<List<Integer>>();
  int f=0;
  if(i<can[0]){
   System.out.println(i+"null");
   d.set(i, null);
   
  }
  for(int num:can){
   if(i-num==0){
    List<Integer> l=new ArrayList<Integer>();
    l.add(num);
    
    ll.add(l);
          f=1;
   }else if(i-num>0){
    if(d.get(i-num)!=null){//傻逼的以为还要判断这个 子问题有没有解 你之前计算过这个子问题 如果没解 它对应的List<List<Integer>> 就是 空的啊size=0啊
     for(int j=0;j<d.get(i-num).size();j++){
      
      List<Integer> l=new ArrayList<Integer>(d.get(i-num).get(j));
      if(num>l.get(l.size()-1)){//顺序判断 保证求出的子集是升序的 子集间不重复的
       l.add(num);
       ll.add(l);
       f=1;
      }
     }
    }else{
     
    }
   }
   
  }
  if(f==1){
   d.set(i,ll);
  }
 }
 System.out.println(d.toString());
    
      
      
    以上是我写的算法 以下是看的别人较好的写法 
 
 int[] cands={2,3,6,7};
 Arrays.sort(cands); // sort candidates to try them in asc order
    List<List<List<Integer>>> dp = new ArrayList<List<List<Integer>>>();
    for (int i = 1; i <= t; i++) { // run through all targets from 1 to t
        List<List<Integer>> newList = new ArrayList(); // combs for curr i
        // run through all candidates <= i
        for (int j = 0; j < cands.length && cands[j] <= i; j++) {
            // special case when curr target is equal to curr candidate
            if (i == cands[j]) newList.add(Arrays.asList(cands[j]));
            // if current candidate is less than the target use prev results
            else for (List<Integer> l : dp.get(i-cands[j]-1)) {//像这样 无解的子问题就进不了这个循环啊 它
                if (cands[j] <= l.get(0)) {
                    List cl = new ArrayList<Object>();
                    cl.add(cands[j]); cl.addAll(l);
                    System.out.println(cands[j]+" "+l.get(0)+cl.toString());
                    newList.add(cl);
                }
            }
        }
        dp.add(newList);
    }
    System.out.print(d.toString());

 
}



2018软考--网络规划设计师【综合知识】视频精讲

根据最新的网络规划设计师考试大纲和作者长期辅导考试的经验,对考试中的所有知识点进行了归类分析和总结,挖掘其中的考试热点、重点、难点和基点,并准确把握考试的重点和难点,对其进行了详细的分析和讲解。让考生的复习应考非常有针对性,起到事半功倍的效果。 希望将来从事网络规划与设计和网络管理与优化的IT从业者;希望通过网络规划设计师考试的学员和不断提升自己能力水平的实践者。(一次付费学习课程,直到通过考试,并且每年真题解析免费更新 )
  • 2016年02月17日 10:33

动态规划动态规划动态规划

  • 2008年11月17日 23:18
  • 1.07MB
  • 下载

算法合计之动态规划(高)

  • 2010年08月11日 15:06
  • 255KB
  • 下载

计算机编程算法的动态规划问题

  • 2010年04月28日 14:36
  • 159KB
  • 下载

动态规划算法详解

  • 2011年11月19日 23:36
  • 442KB
  • 下载

动态规划~动态规划32讲~

  • 2011年06月13日 11:04
  • 275KB
  • 下载

动态规划实验报告瞎子

  • 2009年06月26日 12:22
  • 149KB
  • 下载

有用的动态网页设计制作

  • 2010年03月13日 17:48
  • 887KB
  • 下载

动态规划入门

  • 2011年10月12日 08:40
  • 505KB
  • 下载

动态规划算法动态规划算法动态规划算法动态规划算法

  • 2009年05月09日 20:47
  • 42KB
  • 下载
收藏助手
不良信息举报
您举报文章:动态规划
举报原因:
原因补充:

(最多只允许输入30个字)