zoukankan      html  css  js  c++  java
  • 动态规划之切钢条

        //填写备忘录表。查询。
        //从低到高递归填写备忘录。
        //最初数据,经过几次抉择,产生更多数据。
        public static class dynamicProcess
        {
            public static void test()
            {
                int[] specification={0,1,5,8,9,10,17,17,20,24,30};
            
                
                //fill noteTable.
                Integer[] NoteTable=new Integer[6];
                NoteTable[0]=0;
                fillTable(NoteTable, specification);
                
                int length=5;
                LSLog.printLine(length+" best:"+NoteTable[length], 1);
            }
            
            
            private static void fillTable(Integer[] table,int[] specifition)
            {
                //get each question's best value from 1 to target.
                for(int i=1;i<=table.length-1;i++)
                {
                    //get all group. compare each group's value,and get bestValue.
                    MyLinkedList<MyLinkedList<Integer>> ret=resultList(i,i-1);
                    int bestValue=bestValue(ret,specifition,i,table);
                    LSLog.printLine("---------------------------", 1);
                    table[i]=bestValue;
                }
            }
            
            
            //size:原始数据 .level:进行第几个抉择。
            //对一个多抉择点问题,进行递归抉择。分解:n-1 的结果删除最后一个,再插入2中可能。最小解:level=0,无抉择,创建初值。
            private static MyLinkedList<MyLinkedList<Integer>> resultList(Integer size,Integer level)
            {
                assert(size!=null&& size>0):"data is illvalible.";
                if(level==0)
                {
                    MyLinkedList<Integer> temp=new MyLinkedList<Integer>();
                    temp.add(size);
                    MyLinkedList<MyLinkedList<Integer>> bbLinkedList=new MyLinkedList<MyLinkedList<Integer>>();
                    bbLinkedList.add(temp);
                    return bbLinkedList;
                    
                }
                else 
                {
                    MyLinkedList<MyLinkedList<Integer>> tempret=resultList(size, level-1);
                    MyLinkedList<MyLinkedList<Integer>> tempnew=new MyLinkedList<MyLinkedList<Integer>>();
                    for(int i=0;i<tempret.size();i++)
                    {
                        MyLinkedList<Integer> theOneCopy=tempret.get(i).clone();
                        MyLinkedNode<Integer> theNode=theOneCopy.getNode(theOneCopy.size()-1);
                        Integer theValueInteger=theNode.mdata;
                        
                        int cutValue= level-(size-theOneCopy.mLast.mPre.mdata);
                        
                        theOneCopy.remove(theOneCopy.getNode(theOneCopy.size()-1));
                        theOneCopy.add(cutValue);
                        theOneCopy.add(theValueInteger-cutValue);
                        
                        tempnew.add(theOneCopy);
                    }
                    
                    for(int i=0;i<tempnew.size();i++)
                    {
                        tempret.add(tempnew.get(i));
                    }
                    
                    return tempret;
                }
            }
            private static int bestValue(MyLinkedList<MyLinkedList<Integer>> ret,int[] specifition,int level,Integer[] table)
            {
                
                int bestValue=-1;
                
                for(int i=0;i<ret.size();i++)
                {
                    int tempValue=0;
                    MyLinkedList<Integer> theAnswer=ret.get(i);
                    for(int h=0;h<theAnswer.size();h++)
                    {
                        LSLog.printLine(theAnswer.get(h)+":"+specifition[theAnswer.get(h)], 1);
                        int chooseValue=specifition[theAnswer.get(h)];
                        if(table[theAnswer.get(h)]!=null && table[theAnswer.get(h)]!=0)
                        {
                            chooseValue=table[theAnswer.get(h)];
                        }
                        tempValue+=chooseValue;
                    }
                    bestValue=bestValue>tempValue?bestValue:tempValue;
                    LSLog.printLine("******"+tempValue +".best."+bestValue, 1);
                }
                
                return bestValue;
            }
            
        }
        
    
        
  • 相关阅读:
    Codeforces Round #425 (Div. 2) Problem A Sasha and Sticks (Codeforces 832A)
    bzoj 2301 Problem b
    bzoj 1101 [POI2007]Zap
    bzoj 2005 能量采集
    bzoj 2527 Meteors
    bzoj 2724 [Violet 6]蒲公英
    回顾树状数组
    bzoj 3237 连通图
    bzoj 2733 永无乡
    Codeforces 817C Really Big Numbers
  • 原文地址:https://www.cnblogs.com/lsfv/p/10598573.html
Copyright © 2011-2022 走看看