dp-数字三角形
时间:2021-06-12
本文章向大家介绍dp-数字三角形,主要包括dp-数字三角形使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
数字三角形问题是一个很经典的dp
问题,因为这个题是在书上看到的,所以根本不知道输入是什么!只能通过经验判断输入!!!!
注意:当前版本是我自己臆想出来的输入。
题目描述
有一个非负整数组成的三角形,第一行只有一个数,除了最下行之外每个数的左下方和右下方各有一个数,从第一行的数开始每次可以往左下或者右下走一格,直到走到最下行,把沿途经过的数全部加起来,如何走才能得到最大和?
思考过程1
像题目中这样说,不就是转换成一个数组么?
如图所示,先转成数组:
注意:第\(0\)行和第\(0\)列是不需要的,因为不好计算。第\(k\)行有\(k\)个数。
像这种结构找最大或者最小值,一般就是用深搜,每条路径都要遍历一遍。确定了深搜之后,想一下输入的问题,我以为这道题的输入是给定\(n\),输入这\(n\)个数。所以现在要解决的问题是\(n\)个数一共是多少层:假设\(n\)个数一共可以组成\(k\)层(假设是满的),第\(1\)层有\(1\)数...第\(k\)层有\(k\)个数,则一定有:
\[1 + 2 + 3 + ...+k \geq n
\]
左边就是个等差数列,结果为:
\[\frac{(1+k)*k}{2}
\]
展开可得:
\[k^2+k-2n \geq 0
\]
这里求解\(k\),根据韦达定理,可知:
\[x=\frac{-b\pm \sqrt{b^2-4ac}}{2a}
\]
同过这个公式可以求得\(k\):
\[k_1\geq\frac{\sqrt{1+8n}-1}{2} \\
k_2\leq\frac{-1 - \sqrt{1+8n}}{2}
\]
因为\(k_2\)一定是小于\(0\)的,所以\(k_1\)为最终答案,但此时一定是满的,需要求解的层数进行上取整ceil()
。
深搜代码
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <vector>
#include <map>
#include <cmath>
#include <deque>
using namespace std;
#define MAX_N 100
#define print(a) { \
for (int i = 0; i < 10; i++) {\
for (int j = 0; j < 10; j++) {\
cout << grid[i][j] << " ";\
}\
cout << endl;\
}\
}
int n, grid[MAX_N + 5][MAX_N + 5], ans = 0;
int k;
void dfs(int x, int y, int sum) {
sum += grid[x][y];
// cout << "(" << x << ", " << y << ")" << " " << sum << endl;
if (x == k) {
ans = max(sum, ans);
return ;
}
if (grid[x + 1][y] >= 0) {
dfs(x + 1, y, sum);
}
if (grid[x + 1][y + 1] >= 0) {
dfs(x + 1, y + 1, sum);
}
}
void solve() {
memset(grid, -1, sizeof(grid));
cin >> n;
k = ceil((sqrt(1 + 8 * n) - 1) / 2);
cout << "k = " << k << endl;
for (int i = 1; i <= k; i++) {
for (int j = 1; j <= i; j++) {
cin >> grid[i][j];
// print(grid);
}
}
dfs(1, 1, 0);
cout << ans << endl;
}
int main() {
solve();
return 0;
}
未完!等回来再写!
原文地址:https://www.cnblogs.com/lihanwen/p/14878685.html
- 《Redis设计与实现》读书笔记(三十六) ——Redis 慢查询日志实现
- 概率学中的随机变量与分布
- 神马?SQL竟然可以解脑筋急转弯的题目?
- android中一些特殊字符(如:←↑→↓等箭头符号)的Unicode码值
- 基于SpringBoot的任务管理平台v1.0正式发布
- 大数据系统的Lambda架构
- AKKA中的事件流
- Java初涉感悟
- Android 6.0 Permission权限与安全机制
- SpringBoot工作机制
- Android权限管理PermissionsDispatcher2.3.2使用+原生6.0权限使用
- SpringBoot中的IoC
- Sonar安装配置
- 《AngularJS深度剖析与最佳实践》推荐序
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- php利用ZipArchive类操作文件的实例
- Yii框架页面渲染操作实例详解
- PHP数据源架构模式之表入口模式实例分析
- PHP pthread拓展使用和注意点
- centos6.5下安装zabbix2.4的教程图解
- php经典趣味算法实例代码
- centos7 设置grub密码及单用户登录实例代码
- php面向对象基础详解【星际争霸游戏案例】
- Linux系统下Nginx支持ipv6配置的办法
- Smarty模板变量与调节器实例详解
- Linux中搭建完整的samba服务器全攻略(centos版)
- Thinkphp5 自定义上传文件名的实现方法
- PHP读取文件,解决中文乱码UTF-8的方法分析
- Linux低电量自动关机的实现办法
- php设计模式之工厂方法模式分析【星际争霸游戏案例】