动态规划

原创 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());

 
}



动态规划 源码

  • 2017年10月31日 10:51
  • 12KB
  • 下载

字符串的修改(动态规划-最短编辑距离)

1187: 字符串的修改 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 6  Solved: 5 [Submit][Status][Web ...

动态规划,建桥问题代码

  • 2017年11月09日 17:06
  • 340KB
  • 下载

算法 -- 数字三角形之动态规划

好久没有好好写算法啦,因此今天晚上就思考实现老师说的一道算法题目: 用动态规划求解数字三角形. 下面简单描述下题目含义: 数字三角形中的数字要求为不超过100的非负整数.题目规定从最顶层开始往下走...

算法之动态规划

  • 2016年01月05日 07:48
  • 5KB
  • 下载

逐时段摄动动态规划poa

  • 2015年11月28日 14:49
  • 32KB
  • 下载

动态规划思想求旅行商问题

1.      旅行商问题 1.1 旅行商问题描述 旅行商问题(TSP问题)是指旅行家要旅行n个城市然后回到出发城市,要求各个城市经历且仅经历一次,并要求所走的路程最短。该问题又称为货郎担问题、邮...

动态规划集合划分

  • 2016年12月08日 23:13
  • 15KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:动态规划
举报原因:
原因补充:

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