Re0:DP学习之路 数塔 HDU - 2084(基础递推)
解法
首先是输入的问题,输入的时候还要注意每一层都有多少个
然后是怎么求解,一般求解首先要考虑顺序,是正序还是倒序
如果这个题是正序的话那么最终还需要将最后一行进行一次找max的运算
如果是倒序的话那么最终归于同一个起点,直接进行输出即可
转移方程
转移方程考虑把问题分散化,分散成小的问题,其中这个题的问题就是如果要找最大的,那么每一个数的下面两个相邻的数应该取最大的
所以就是dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+num[i][j]
如果要进行正推,那么应该是每一个数上面和左边的数的最大值加当前的数那么转移方程就是dp[i][j]=max(dp[i-1][j-1],dp[i-1][j])+num[i][j]
所以转移方程为
倒推
dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+num[i][j]
正推
dp[i][j]=max(dp[i-1][j-1],dp[i-1][j])+num[i][j]
代码
倒推
#include <bits/stdc++.h>
using namespace std;
int dp[1000][1000],num[1000][1000];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
cin>>num[i][j];
for(int i=n;i>=1;i--)
for(int j=1;j<=i;j++)
dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+num[i][j];
cout<<dp[1][1]<<"\n";
}
}
正推
#include <bits/stdc++.h>
using namespace std;
int dp[1000][1000],num[1000][1000];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t;
cin>>t;
while(t--)
{
int n,maxn=-1;
cin>>n;
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
cin>>num[i][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
dp[i][j]=max(dp[i-1][j-1],dp[i-1][j])+num[i][j];
for(int i=1;i<=n;i++)
maxn=max(maxn,dp[n][i]);
cout<<maxn<<"\n";
}
}
Re0:DP学习之路 数塔 HDU - 2084(基础递推)的更多相关文章
- 数塔(hdoj 2084,动态规划递推)
在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少? 已经告诉你了,这是个DP的题目 ...
- Re0:DP学习之路 Proud Merchants HDU - 3466
解法 排序+01背包 这里的排序规则用q-p升序排列这里是一个感觉是一个贪心的策略,为什么这样做目前也无法有效的证明或者说出来 然后就是01背包加了一个体积必须大于什么值可以装那么加一个max(p,q ...
- Re0:DP学习之路 饭卡 HDU - 2546
解法 01背包变式,首先贪心的想一下如果要保证余额最小那么就需要用相减后最小的钱减去之前最大的价格,且得保证这个钱在5元以上 对于寻找如何减最多能包含在5元以上,这里用01背包 我们把价钱看做体积装进 ...
- Re0:DP学习之路 母牛的故事 HDU - 2018
解法 一定要注意斐波那契数列的原始意义,斐波那契数列也叫作兔子数列是兔子繁衍的一种表示方法.同样适用于别的情况的动物繁衍问题 原始的是3个月一胎现在四个月那么方程就是 f(n)=n n<=4 f ...
- Re0:DP学习之路 01背包如何打印路径?
伪代码 用二维数组记录,如果出现可以转移的dp那么记录bk[当前体积][装的物品]=1 输出的时候倒推,如果存在连通的边那么输出并且总共的体积减去输出的体积 代码(uva-624,目前wa不明所以,网 ...
- dp入门--poj 1163数塔
...
- dp入门题(数塔)
http://acm.hdu.edu.cn/showproblem.php?pid=2084 题意: 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 在上 ...
- 致初学者(四):HDU 2044~2050 递推专项习题解
所谓递推,是指从已知的初始条件出发,依据某种递推关系,逐次推出所要求的各中间结果及最后结果.其中初始条件或是问题本身已经给定,或是通过对问题的分析与化简后确定.关于递推的知识可以参阅本博客中随笔“递推 ...
- HDU 4747 Mex 递推/线段树
题目链接: acm.hdu.edu.cn/showproblem.php?pid=4747 Mex Time Limit: 15000/5000 MS (Java/Others)Memory Limi ...
随机推荐
- tracert 路由跟踪程序
C:\Users\Administrator>tracert 10.0.0.1 通过最多 30 个跃点跟踪到 10.0.0.1 的路由 1 <1 毫秒 1 ms 3 ms 192.168. ...
- YTU 2677: 韩信点兵
2677: 韩信点兵 时间限制: 1 Sec 内存限制: 128 MB 提交: 61 解决: 38 题目描述 刘邦问韩信:"你觉得我可以带兵多少?"韩信:"最多十万. ...
- golang中管道热替换
golang中管道替换问题 https://blog.csdn.net/cyk2396/article/details/78875347 1.运行以下代码: var chan1 chan int va ...
- window系统 查看端口 被哪个进程占用了
一.在windows命令行窗口下执行:运行--cmdC:\>netstat -aon|findstr "8080" TCP 127.0.0.1:80 0. ...
- Vue.js实战 5.5章 购物车
<!DOCTYPE html> <html lang="en"> <head> <title>购物车示例</title> ...
- Kettle 连接 oracle 报错:could not be found, make sure the 'Oracle' driver (jar file) is installed.
我的ETL版本为6.0 oracle版本为11.2.0 报错如下: Driver class 'oracle.jdbc.driver.OracleDriver' could not be found, ...
- 使用showmap分析android进程内存占用情况(转载)
转自:http://my.oschina.net/shaorongjie/blog/105354 可以使用adb shell showmap pid查看一个进程的showmap,这对于我们来说非常有用 ...
- PCB 批量Word转PDF实现方法
自上次公司电脑中毒带来的影响,导致系统自动生成的Word档PCB出货报告,通过公司邮件服务器以附件的方式发送给客户后,客户是无法打开或打开缓慢的现象,如果将Word档转为PDF后在客户端是可以正常打开 ...
- Linux安装MySQL标准教程
导读: 本文主要介绍 CentOS 系统二进制安装 MySQL 5.7.23 版本的安装步骤,其他版本安装过程相似. 1.前置准备 卸载旧版MySQL 查看rpm包 rpm -qa|grep mysq ...
- SQL 设置登录名和密码
1.打开SQL Server Manager管理器,在左面找到 ‘安全性’ 单击右键 选择‘新建”->“登录”, 如下图 2.弹出对话框,在登录名中输入你的登录号,选择'SQLSERVER身份验 ...