标签:
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 36261 Accepted Submission(s): 21659
我觉得这道题的解题步骤就完全可以用这个来描述:
1.首先,一个最优解的结构特征,即从顶层走到底层,其各个节点的最大数字之和的为最优解。
2.题目中要求走法为自顶向下,且每一步只能走到相邻的节点,那么每个节点只有两种选择,即这个节点的两个子节点;
那么这个节点的最优解就等于这个节点的值加上其两个节点的最优解的最大值;
3.自底向上的求解。
4.我们所求出来的解就是我们所需要的答案,则第四步在这里可以忽略掉。
最后附上我的代码:
我用数组a来接收数塔的值,则第三部可以表示为:a[i][j]的最优解=max(a[i+1][j]的最优解,a[i+1][j+1]的最优解);
而数塔最底层节点的最优解就等于他本身的值,因为他只有一个;那么最底层的值已知,我们只需要从下往上递推就可以了
即这三行代码块:
for(i=n-1;i>=0;i--)
for(j=0;j<=i;j++)
a[i][j]=a[i][j]+max(a[i+1][j],a[i+1][j+1]);
1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 using namespace std; 5 6 int main() 7 { 8 int a[105][105]; 9 int t, n, i, j; 10 while(cin>>t) 11 { 12 while(t--) 13 { 14 cin>>n; 15 memset(a,0,sizeof(a)); 16 for(i=0;i<n;i++) 17 for(j=0;j<=i;j++) 18 cin>>a[i][j]; 19 for(i=n-1;i>=0;i--) 20 for(j=0;j<=i;j++) 21 a[i][j]=a[i][j]+max(a[i+1][j],a[i+1][j+1]); 22 cout<<a[0][0]<<endl; 23 } 24 } 25 return 0; 26 }
标签:
原文地址:http://www.cnblogs.com/zyx1301691180/p/5727918.html