算法之动态规划最优二叉树

  1. packagecom.eshore.sweetop.dynamicprogramming;
  2. publicclassBestBinTree{
  3. //关键字节点,p[0]为构造数据
  4. //double[]p={0,0.15,0.10,0.05,0.10,0.20};
  5. //虚拟节点
  6. //double[]q={0.05,0.10,0.05,0.05,0.05,0.10};
  7. //规模
  8. //intn=5;
  9. double[]p={0,0.04,0.06,0.08,0.02,0.10,0.12,0.14};
  10. double[]q={0.06,0.06,0.06,0.06,0.05,0.05,0.05,0.05};
  11. staticintn=7;
  12. double[][]e=newdouble[n+2][n+1];
  13. double[][]w=newdouble[n+2][n+1];
  14. int[][]root=newint[n+2][n+2];
  15. publicvoidoptimalBest(){
  16. for(inti=1;i<e.length;i++){
  17. e[i][i-1]=q[i-1];
  18. w[i][i-1]=q[i-1];
  19. }
  20. for(intl=1;l<n+1;l++){
  21. for(inti=1;i<=n-l+1;i++){
  22. intj=i+l-1;
  23. e[i][j]=Double.MAX_VALUE;
  24. w[i][j]=w[i][j-1]+p[j]+q[j];
  25. for(intr=i;r<=j;r++){
  26. doublet=e[i][r-1]+e[r+1][j]+w[i][j];
  27. if(t<e[i][j]){
  28. e[i][j]=t;
  29. System.out.println(r);
  30. root[i][j]=r;
  31. }
  32. }
  33. }
  34. }
  35. //BestBinTree.display(w);
  36. //BestBinTree.display(e);
  37. BestBinTree.display(root);
  38. BestBinTree.viewTree(root);
  39. }
  40. publicstaticvoiddisplay(double[][]a){
  41. for(inti=1;i<a.length;i++){
  42. for(intj=1;j<a[0].length;j++){
  43. System.out.print(String.format("%.2f",a[i][j])+"/t");
  44. }
  45. System.out.println();
  46. }
  47. }
  48. publicstaticvoiddisplay(int[][]a){
  49. for(inti=1;i<a.length;i++){
  50. for(intj=1;j<a[0].length;j++){
  51. if(i<=j)
  52. System.out.print(a[i][j]+"");
  53. }
  54. System.out.println();
  55. }
  56. }
  57. publicstaticvoidviewTree(int[][]a){
  58. System.out.println("根是k"+a[1][n]);
  59. view(a,a[1][n],1,n);
  60. //System.out.println(a[6][7]);
  61. }
  62. publicstaticvoidview(int[][]a,introot,inti,intj){
  63. if(a[i][root-1]==0){
  64. System.out.println("k"+root+"左孩子是d"+(root-1));
  65. }else{
  66. System.out.println("k"+root+"左孩子是k"+a[i][root-1]);
  67. view(a,a[i][root-1],i,root-1);
  68. }
  69. if(a[root+1][j]==0){
  70. System.out.println("k"+root+"右孩子是d"+root);
  71. }else{
  72. System.out.println("k"+root+"右孩子是k"+a[root+1][j]);
  73. view(a,a[root+1][j],root+1,j);
  74. }
  75. }
  76. publicstaticvoidmain(String[]args){
  77. BestBinTreebbt=newBestBinTree();
  78. bbt.optimalBest();
  79. }
  80. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值