SCU - 1114 数字三角(dp入门ing)

下图是个数字三角,请编写一个程序计算从顶部至底部某处一条路径,使得该路径所经过的数字总和最大。

7

3 8

8 1 0

2 7 4 4

1. 每一步可沿左斜线向下或右斜线向下走;

2. 1<=三角形行数<=100

3. 三角形中的数字为整数 0,1,……,99。

4. 如果有多种情况结果都最大,任意输出一种即可。

输入:

第一行一个整数N,代表三角形的行数。

接下来N行,描述了一个数字三角。

输出:
第一行一个整数,代表路径所经过底数字总和。
第二行N个数,代表所经过的数字。

样例:

输入:

4
7
3 8
8 1 0
2 7 4 4

输出:

25
7 3 8 7

个人分析:

关于这个dp的题呢,我就把我的源代码分三个重要板块来解释,每一个解释在代码块的下面,三个板块分别是:输出最大数字总和 寻找路径上的数字 打印路径上的数字

1. 输出最大数字总和

 for(int i=n-2;i>=0;i--){for(int j=0;j<=i;j++){a[i][j]+=a[i+1][j]>a[i+1][j+1]? a[i+1][j]:a[i+1][j+1];}}cout<<a[0][0]<<endl;

对以上代码的解释:
对于这个题呢,我采用的方向:由下而上求最大和。每一次确定两层,较高一层的每个数字分别选择加上下面较大的数字,然后上移,原来的上层变为下一个的下层,最终顶层存储了最大数字总和。最后直接输出a[0][0]首项
而我们的a数组就相当于打了一张表 存储每个阶段的和(并不直接是最大的)
我们的“第一行”是从数组的倒数第二行开始~

2. 寻找路径上的数字

 int k=0,temp=0;for(int i=0;i<n;i++){if(a[i+1][k]>a[i+1][k+1]){temp=k;}else{temp=k+1;}p[i]=a[i][k]-a[i+1][temp];k=temp;}

对以上代码的解释:
这个题难点就在寻找路径上的数字,那么,我们可以从上往下来,我们不是已经求出了最大和了吗?我们的数字可以通过当前和-下一层的两个中最大的那个就是我们的数字
这里用了一个temp变量来确定是下一层左边那个还是右边那个 左边那个就还为k 如果是右边那个的话,那么我们就k+1赋值给temp

3.打印路径上的数字

for(int i=0;i<n;i++){if(i){cout<<" ";}cout<<p[i];}

对以上代码的解释:
看了上面的寻找路径上的数字了后,打印就不是事了,我们是用p数组来存储的,然后题目要求数字与数字之间有空格,然后最后一个数字后面应该是不能有空格的,所以按上面的模块来输出,这个我拿出来呢,是因为我学习的别人的代码,我想应该有一部分也不太懂哦!

个人感受:

这个题也是我做的第一个关于dp的题目,一个寒假也快过完了,dp刚刚入门,在学校也还是会继续坚持写博客 也是为了下学期算法课与后面比赛好好做准备,dp思想很重要,对这个题我也是想了好久然后参考别人博文想明白的,每次想清楚一道题就特别有成就感!加油!
具体代码如下:

#include<iostream>
using namespace std;
int a[108][108];
int p[108];
int main()
{int n;cin>>n;for(int i=0;i<n;i++){for(int j=0;j<=i;j++){cin>>a[i][j];}}for(int i=n-2;i>=0;i--){for(int j=0;j<=i;j++){a[i][j]+=a[i+1][j]>a[i+1][j+1]? a[i+1][j]:a[i+1][j+1];}}cout<<a[0][0]<<endl;int k=0,temp=0;for(int i=0;i<n;i++){if(a[i+1][k]>a[i+1][k+1]){temp=k;}else{temp=k+1;}p[i]=a[i][k]-a[i+1][temp];k=temp;}for(int i=0;i<n;i++){if(i){cout<<" ";}cout<<p[i];}return 0;
}

- 过了一天,一部分优化后的代码

#include<iostream>
using namespace std;
const int maxn=100+8;
int a[maxn][maxn];
int dp[maxn];
int main()
{int n;cin>>n;for(int i=0;i<n;i++){for(int j=0;j<=i;j++){cin>>a[i][j];}}for(int i=n-2;i>=0;i--){for(int j=0;j<=i;j++){a[i][j]+=a[i+1][j]>a[i+1][j+1]? a[i+1][j]:a[i+1][j+1];}}cout<<a[0][0]<<endl;int temp=0,j=0;for(int i=0;i<n;i++){temp=a[i+1][j]>a[i+1][j+1]? j:j+1;dp[i]=a[i][j]-a[i+1][temp];j=temp;}for(int i=0;i<n;i++){if(i){cout<<" ";}cout<<dp[i];}return 0;
}
学如逆水行舟,不进则退

SCU - 1114 数字三角(dp入门ing)相关推荐

  1. 数位dp入门题 洛谷P2657 [SCOI2009] windy 数

    题干 传送门 windy 定义了一种 windy 数. 题目描述 不含前导零且相邻两个数字之差至少为 2的正整数被称为 windy 数.windy 想知道,在 a 和 b 之间,包括 a 和 b ,总 ...

  2. hdu 2089 数位dp入门

    HDU 2089 题意:中文题 思路:数位dp入门题 AC代码: #include "iostream" #include "string.h" #includ ...

  3. HDU2032 杨辉三角【入门】

    杨辉三角 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submissi ...

  4. 数字IC设计入门方法与资料大全

    0. 前言 正准备入行数字芯片设计的同志们可以看看以下几篇行业入门介绍的文章,因水平有限,文中难免存在疏漏.错误之处,与最新技术脱节之处必定不少,敬请细心的读者不吝指教.有用的您带走,没用的就当笑话看 ...

  5. 数字图像处理(入门篇)目录

    目录: 1  数字图像处理(入门篇)一 图像的数字化与表示 2 数字图像处理(入门篇)二 颜色空间 3 数字图像处理(入门篇)三 灰度化 4 数字图像处理(入门篇)四 像素关系 5 数字图像处理(入门 ...

  6. 10303 数字三角

    10303 数字三角(必做) 时间限制:1000MS  内存限制:65535K 提交次数:117 通过次数:56 题型: 编程题   语言: C++;C;VC;JAVA Description 问题描 ...

  7. 打印数字三角及蛇形矩阵(C语言)

    题目描述: 从键盘输入N,输出如下图所示的N行的数字三角. 例如: N = 5,那么输出如下: 输入格式: 输入一个整数N,1<= N <= 45 输出格式: 输出如题所示的数字三角形,为 ...

  8. DP动态规划企业级模板分析(数字三角,上升序列,背包,状态机,压缩DP)

    前言 经过基础的算法模型讲解和题海战术,将DP动态规划这个重点呢考纲进行细分题类型,此篇是上半章节的DP动态分析提升题.主要包括数字三角形,以及最大上升序列,背包问题,状态机的拆分以及优化状态机的压缩 ...

  9. TKO 6-1 DP入门之1058(寻找第n个因数只有2、3、5、7的数字)

    杭电1058: Problem Description A number whose only prime factors are 2,3,5 or 7 is called a humble numb ...

最新文章

  1. keras 的 example 文件 mnist_swwae.py 解析
  2. DataSet导出CSV格式(ASP.NET,C#)
  3. 走进Java 7模块系统
  4. 合理利用延迟初始化优化 Spring Boot
  5. ei会议论文录用但不参加会议_会议论文有录用通知吗
  6. 密码(图解密码技术)_第一章_环游密码世界总结
  7. Feed43自定义 RSS 订阅源
  8. PHP中header的用法
  9. 如何才能做出一个顶级的客户端
  10. 《微课实战:Camtasia Studio入门精要》——第2章 录制视频 2.1 录制视频基本常识...
  11. 新媒体增长方法从哪里找?
  12. ZooKeeper官方文档学习笔记03-程序员指南
  13. android 模拟器 403,Android403R2模拟器安装.doc
  14. 算法竞赛入门经典 1 实验
  15. python转换成exe后会出现dos框_解决Pyinstaller 打包exe文件 取消dos窗口(黑框框)的问题...
  16. C10K问题及解决方案
  17. matlab实现单峰物体复原--光栅投影-多频外差
  18. 单片机STM32开发环境的安装
  19. 插入数据 java_JAVA插入数据笔记
  20. 【PC】如何导出windows锁屏壁纸

热门文章

  1. 合同法律风险管理 合同签字后果
  2. 互联网下半场,为什么公司和个人都追捧“增长黑客”?
  3. 利用python爬取股票实时信息
  4. install developing enviroment
  5. 电脑黑屏只有鼠标能动怎么办???
  6. Artetxe2018CoNLL_Uncovering divergent linguistic information in word embeddings...
  7. 服务器是由哪些硬件构成的?带你一探究竟!
  8. java 实现http长轮询,webim使用http长轮询如何保证消息的绝对实时性
  9. mysql count star_精品_MySQL常用SQL.md
  10. 地图兴趣点搜索一(基本流程)