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 ...
随机推荐
- 在linux上处理base64加密和解密
http://snailwarrior.blog.51cto.com/680306/142472/ 2.从标准输入读取文件内容,base64编码并打印到标准输出 [root@localhost tes ...
- 控件CListCtr详解
1.CListCtrl控件 CListCtrl控件在数据库编程中是用得比较多的控件之一,也是Window控件中较难掌握的一个控件.他可以有四显示方式,Report.List.Icon.SmallIco ...
- [翻译]NUnit---Action Attributes(八)
Attributes NUnit 1.0使用传统的基于继承和命名约定来识别测试.从2.0开始NUnit使用自定义特性来实现. 因为NUnit的test fixtures不是从框架类库继承,所以开发人员 ...
- poj 2762(tarjan缩点+判断是否是单链)
Going from u to v or from v to u? Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 19234 ...
- 【HAOI 2007】 理想的正方形
[题目链接] 点击打开链接 [算法] 单调队列 [代码] #include<bits/stdc++.h> using namespace std; #define MAXN 1010 co ...
- C++ 值初始化和默认初始化
对于初始化的问题,我之前一直傻傻分不清.有关初始化以及赋值的区别也是一问题,这次回过头来看,配合<<CSAPP>>的内容,对初始化有了一些新的认识. 声明: 在环境/上下文中指 ...
- Nginx(二) 反向代理&负载均衡
1.反向代理 当我们请求一个网站时,nginx会决定由哪台服务器提供服务,就是反向代理. nginx只做请求的转发,后台有多个tomcat服务器提供服务,nginx的功能就是把请求转发给后面的服务器, ...
- QQ自动登录Demo源码(附全套WindowsApi)
在开发过程中,偶尔会有自动化操作软件的需求,便想到用句柄实现自动化的功能,记录下知识点,以作备忘. 实现流程: 获取窗口句柄,根据定位获取input,调用windowsapi模拟鼠标点击, 输入 , ...
- 【题解】自行车比赛 [AHOI2016] [P2777]
[题解]自行车比赛 \([AHOI2016]\) \([P2777]\) 逼自己每天一道模拟题 传送门:自行车比赛 \([AHOI2016]\) \([P2777]\) [题目描述] 比赛中一共有 \ ...
- [转]Linux系统调用--fcntl函数详解
功能描述:根据文件描述词来操作文件的特性. 文件控制函数 fcntl -- file control头文件: #include <unistd.h> #include & ...