//填写备忘录表。查询。
//从低到高递归填写备忘录。
//最初数据,经过几次抉择,产生更多数据。
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;
}
}