首页 > 代码库 > 数塔问题(DP算法)自底向上计算最大值
数塔问题(DP算法)自底向上计算最大值
Input
输入数据首先包括一个整数C,表示测试实例的个数,每个测试实例的第一行是一个整数N(1 <= N <= 100),表示数塔的高度,接下来用N行数字表示数塔,其中第i行有个i个整数,且所有的整数均在区间[0,99]内。
Output
对于每个测试实例,输出可能得到的最大和,每个实例的输出占一行。
Sample Input
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
Sample Output
30
1 #include<iostream> 2 #include<math.h> 3 #include<malloc.h> 4 using namespace std; 5 6 int num=0; 7 8 typedef struct Tree 9 { 10 int val; 11 int max; 12 struct Tree*left;//左分支节点 13 struct Tree*right;//右分支节点 14 struct Tree*sib;//兄弟节点 15 struct Tree*next;//linenumber 16 struct Tree*pre;//前继行 17 }Tree,*TreeNode; 18 19 TreeNode first; 20 21 22 void construction(int i,int j,int loc,int col)//构造树形结构 23 { 24 int linenum; 25 linenum=j;//return the linenumber; 26 27 int k; 28 if(linenum==1) 29 first->val=i; 30 else{ 31 TreeNode p; 32 p=first; 33 34 /* for(k=1;k<linenum-1;k++)//锁定行 35 { 36 p=p->next; 37 }*/ 38 while(p->next!=NULL) 39 p=p->next;//锁定行 40 41 TreeNode q; 42 q=(TreeNode)malloc(sizeof(Tree)); 43 q->val=i; 44 q->left=NULL; 45 q->right=NULL; 46 q->next=NULL; 47 q->sib=NULL; 48 //赋值 49 50 51 if(col==1)//处理第一列的情况 52 { 53 p->next=q; 54 q->pre=p; 55 q->sib=NULL; 56 q->next=NULL; 57 58 59 } 60 else 61 { 62 if(col==2) 63 {} 64 else 65 { 66 while(p->sib!=NULL) 67 { 68 69 p=p->sib; 70 } 71 } 72 73 p->sib=q; 74 q->sib=NULL; 75 76 77 } 78 79 80 //返回上一行 81 82 p=first; 83 for(k=1;k<linenum-1;k++)//锁定上一行 84 { 85 p=p->next; 86 87 } 88 //锁定上一列的位置 89 90 for(k=1;k<col-1;k++) 91 { 92 93 if(p->sib!=NULL) 94 p=p->sib; 95 } 96 97 if(col==1) 98 { 99 100 p->left=q; 101 102 } 103 else if(col==linenum)//debug 104 { 105 p->right=q; 106 107 } 108 109 else 110 { 111 112 p->right=q; 113 114 p=p->sib; 115 116 p->left=q; 117 118 } 119 120 121 122 123 124 } 125 126 } 127 128 129 130 void cal(TreeNode p) 131 { 132 while(p->next!=NULL) 133 p=p->next; 134 135 p=p->pre; 136 137 TreeNode q,f; 138 q=p; 139 while(q!=NULL) 140 { 141 f=q; 142 while(f!=NULL) 143 { 144 int m; 145 m=f->left->val+f->val; 146 int n; 147 n=f->right->val+f->val; 148 if(m>n) 149 f->val=m; 150 else 151 f->val=n; 152 f=f->sib; 153 154 } 155 q=q->pre; 156 } 157 158 } 159 160 int main() 161 { 162 int input,m; 163 first=(TreeNode)malloc(sizeof(Tree)); 164 first->next=NULL; 165 first->sib=NULL; 166 first->left=NULL; 167 first->right=NULL; 168 first->pre=NULL; 169 //Initial the first node 170 cin>>input; 171 m=input; 172 int j=1; 173 for(int i=1;i<=m;i++) 174 { 175 for(int k=1;k<=i;k++) 176 { 177 int a1; 178 cin>>a1; 179 construction(a1,i,j,k); 180 j++; 181 } 182 } 183 184 185 186 187 cal(first); 188 cout<<first->val<<endl; 189 return 0; 190 }
数塔问题(DP算法)自底向上计算最大值
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。