数塔问题(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 }

时间: 2024-10-12 20:21:41

数塔问题(DP算法)自底向上计算最大值的相关文章

HDU 2084 数塔 --- 入门DP

HDU 2084 数塔 从下往上递推,状态转移方程 dp[i][j] = max( dp[i+1][j], dp[i+1][j+1]) + a[i][j]; /* HDU 2084 数塔 --- 入门DP */ #include <cstdio> const int N = 105; int dp[N][N]; int MAX(int a, int b){ return a > b ? a : b; } int main() { #ifdef _LOCAL freopen("D

hdu 2084 &amp; POJ 1163 数塔 (dp)

数塔 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 24626    Accepted Submission(s): 14814 Problem Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少

计蒜客课程竞赛入门--数塔问题(DP) 流程记

还记得上一节提到的数塔问题么?我们接下来一起解决它吧.          9       12 15     10  6  8   2  18  9  519  7  10  4  15上面这张图是一个数塔问题的例子.每次从顶部元素,就是上图中的9出发,每次可以走到下面相邻的两个节点,比如从9往下相邻的是12和15,6往下相邻的是18和9.找到一条从顶部到底部的路径,使得路径上的数值和最大. 一个直观的贪心策略是每次向下走都选择较大的那一个,得到的一个解是9+15+8+9+10=51,然而我们发

HDU 2084 数塔(简单DP入门)

数塔 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 41852    Accepted Submission(s): 24820 Problem Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的:有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?

hdu----(2084)数塔(dp)

数塔 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 22140    Accepted Submission(s): 13366 Problem Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?

HDU - 2084 数塔 (dp)

题意:在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少? 分析:按照行走路径状态转移即可. #include<cstdio> #include<cstring> #include<cstdlib> #include<cctype> #include<cmath> #include<iostream> #include&

HDU 数塔 (dp)

数塔 Time Limit : 1000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submission(s) : 10   Accepted Submission(s) : 7 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有

数塔(dp)

数塔 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 30157    Accepted Submission(s): 18041 Problem Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?

hdu 2084 数塔 (简单dp)

http://acm.hdu.edu.cn/showproblem.php?pid=2084 数塔 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 28668    Accepted Submission(s): 17230 Problem Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下