numtri解题报告 —— icedream61 博客园(转载请注明出处)
------------------------------------------------------------------------------------------------------------------------------------------------
【题目】
  有一个数字的金字塔,形状如下
        7
       3 8
      8 1 0
     2 7 4 4
    4 5 2 6 5
  要从顶端开始走,每次只能向左下或者右下走,求所经过的数字之和最大值。
【数据范围】
  1<=R<=1000
  0<=每个数<=100
【输入样例】
  5
  7
  3 8
  8 1 0
  2 7 4 4
  4 5 2 6 5
【输出样例】
  30
------------------------------------------------------------------------------------------------------------------------------------------------
【分析】
  DP。
  设num[i][j]为i行j列的数,d[i][j]是从1行1列走到i行j列的当前最优解。
    d[1][1]=num[1][1];
    d[i][j]=0; // i>1 or j>1
  从1行1列走到R行某列的最大值,可以直接递归出来,状态转移方程如下:
    当i==1,j>=2时,d[i][j]=d[i-1][j]+num[i][j];
    当i>=2,j>=2时,d[i][j]=max{d[i-1][j]+num[i][j],d[i-1][j-1]+num[i][j]};
  但本题,递归有边界情况,比较麻烦,递推更方便,状态转移方程如下:
    当i>=2,2<=j<R时
      d[i+1][j]=max{d[i+1][j],d[i][j]+num[i+1][j]};
      d[i+1][j+1]=max{d[i+1][j+1],d[i][j]+num[i+1][j+1]};
  最终,只要扫过d[R][1~R]取得最大值输出即可。
------------------------------------------------------------------------------------------------------------------------------------------------
【总结】
  一遍AC。

------------------------------------------------------------------------------------------------------------------------------------------------

【代码】

 /*
ID: icedrea1
PROB: numtri
LANG: C++
*/ #include <iostream>
#include <fstream>
using namespace std; int R;
int num[][],d[][]; void change(int &r,int x) { if(x>r) r=x; } int main()
{
ifstream in("numtri.in");
ofstream out("numtri.out"); in>>R;
for(int i=;i<=R;++i)
for(int j=;j<=i;++j) in>>num[i][j]; d[][]=num[][];
for(int i=;i<R;++i)
for(int j=;j<=i;++j)
{
change(d[i+][j],d[i][j]+num[i+][j]);
change(d[i+][j+],d[i][j]+num[i+][j+]);
} int maxSum=;
for(int j=;j<=R;++j) change(maxSum,d[R][j]);
out<<maxSum<<endl; in.close();
out.close();
return ;
}

最新文章

  1. php中会话保持 session 与cooker
  2. function中的ajax怎么返回一个数
  3. ZJOI2014 2048
  4. hdu4825 字典树 XOR
  5. insert into hi_user_score set hello_id=74372073,a=10001 on duplicate key update hello_id=74372073, a=10001
  6. 【服务器环境搭建-Centos】tmpfs,【转载】
  7. Java程序发展之路
  8. C语言格式化输出,空位补0,空位补空格
  9. 使用Android简单实现有道电子词典
  10. HOJ2275 Number sequence
  11. hdu_5711_Ingress(TSP+贪心)
  12. vue视频学习笔记07
  13. 怎么用VBS脚本自动注册yy娱乐的账号
  14. AIO5程序中审批跳转条件:超过某一个值必须总经理审批
  15. android 滑动分页
  16. 在 Ubuntu 系统中部署 Git Server
  17. 查看ntp时间是否同步
  18. MySQL报错: SQLSTATE[HY000]: General error: 1030 Got error 28 from storage engine
  19. java实现文件的断点续传
  20. vue全局变量定义和修改

热门文章

  1. CToolTipCtrl使用详细解说
  2. py常见模块
  3. python 面向对象(三)--继承和多态
  4. Thread 创建线程
  5. jQuery实现轮播切换以及将其封装成插件(3)
  6. Strut2 的 Action获取JSP 页面参数的方法
  7. 关于webpack打包vue后vendor包过大的问题
  8. Java面试不得不知的程序(二)
  9. 【iOS】史上最全的iOS持续集成教程 (上)
  10. 触发ionic弹窗区域外的方法