[关闭]
@lunar 2016-03-03T19:03:13.000000Z 字数 1463 阅读 1100

HiHo一下 Week5 数字三角形

HiHo


问题描述

一个被称为“数字三角形”的n(n不超过200)层迷宫,这个迷宫的第i层有i个房间,分别编号为1..i。除去最后一层的房间,每一个房间都会有一些通往下一层的房间的楼梯,用符号来表示的话,就是从第i层的编号为j的房间出发会有两条路,一条通向第i+1层的编号为j的房间,另一条会通向第i+1层的编号为j+1的房间,而最后一层的所有房间都只有一条离开迷宫的道路。这样的道路都是单向的,也就是说当沿着这些道路前往下一层的房间或者离开迷宫之后,小Ho没有办法再次回到这个房间。迷宫里同时只会有一个参与者,而在每个参与者进入这个迷宫的时候,每个房间里都会生成一定数量的奖券,这些奖券可以在通过迷宫之后兑换各种奖品。小Ho的起点在第1层的编号为1的房间,现在小Ho悄悄向其他参与者弄清楚了每个房间里的奖券数量,希望小Hi帮他计算出他最多能获得多少奖券。

输入

每个测试点(输入文件)有且仅有一组测试数据。

每组测试数据的第一行为一个正整数n,表示这个迷宫的层数。

接下来的n行描述这个迷宫中每个房间的奖券数,其中第i行的第j个数代表着迷宫第i层的编号为j的房间中的奖券数量。

测试数据保证,有100%的数据满足n不超过100

对于100%的数据,迷宫的层数n不超过100

对于100%的数据,每个房间中的奖券数不超过1000

对于50%的数据,迷宫的层数不超过15(小Ho表示2^15才3万多呢,也就是说……)

对于10%的数据,迷宫的层数不超过1(小Hi很好奇你的边界情况处理的如何?~)

对于10%的数据,迷宫的构造满足:对于90%以上的结点,左边道路通向的房间中的奖券数比右边道路通向的房间中的奖券数要多。

对于10%的数据,迷宫的构造满足:对于90%以上的结点,左边道路通向的房间中的奖券数比右边道路通向的房间中的奖券数要少。

输出

对于每组测试数据,输出一个整数Ans,表示小Ho可以获得的最多奖券数。

样例输入

  1. 5
  2. 2
  3. 6 4
  4. 1 2 8
  5. 4 0 9 6
  6. 6 5 5 3 6

样例输出

    28

思路

简单的DP问题,对于走到第i层第j个房间时能获得的最多奖励为reward[i,j],则

  1. reward[i,j]=max(reward[i-1,j],reward[i-1,j+1])+maze[i,j];

当然,对于每层第一个和最后一个房间特判,总层数只有一层时特判。

代码

  1. #include <iostream>
  2. using namespace std;
  3. int max(int a,int b){
  4. if(a>b) return a;
  5. else return b;
  6. }
  7. int main(){
  8. int maze[102][102]= {0};
  9. int n;
  10. cin >>n;
  11. for(int i=1;i<=n;i++)
  12. for(int j=0;j<i;j++)
  13. cin >> maze[i][j];
  14. if(n==1)cout << maze[1][0];
  15. else{
  16. for (int i=2;i<=n;i++)
  17. for(int j=0;j<i;j++){
  18. if(j==0)maze[i][j]=maze[i][j]+maze[i-1][j];
  19. else{
  20. if(j==(i-1))maze[i][j]=maze[i][j]+maze[i-1][j-1];
  21. else maze[i][j]=max(maze[i-1][j],maze[i-1][j-1])+maze[i][j];
  22. }
  23. }
  24. int ans=-1;
  25. for(int i=0;i<n;i++){
  26. if(maze[n][i]>ans) ans = maze[n][i];
  27. }
  28. cout << ans;
  29. }
  30. return 0;
  31. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注