hdu 2048 数塔 (最经典也是最简单的dp)
来源:互联网 发布:阿里云深圳机房ip地址 编辑:程序博客网 时间:2024/06/18 08:26
本题地址:点击打开链接
数塔
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 43373 Accepted Submission(s): 25664
Problem Description
在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的:
有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?
已经告诉你了,这是个DP的题目,你能AC吗?
有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?
已经告诉你了,这是个DP的题目,你能AC吗?
Input
输入数据首先包括一个整数C,表示测试实例的个数,每个测试实例的第一行是一个整数N(1 <= N <= 100),表示数塔的高度,接下来用N行数字表示数塔,其中第i行有个i个整数,且所有的整数均在区间[0,99]内。
Output
对于每个测试实例,输出可能得到的最大和,每个实例的输出占一行。
Sample Input
1573 88 1 0 2 7 4 44 5 2 6 5
Sample Output
30
Source
2006/1/15 ACM程序设计期末考试
Recommend
lcy | We have carefully selected several similar problems for you: 1176 1003 1087 1159 1069
先稍微介绍一下动态规划:
1.可以使用动态规划的题目特点:
一个大问题可以划分若干个子问题,其中:子问题和原问题的性质一样但是规模变小,并且子问题有重复。
2.动态规划高效的原理:
转化成非递归的问题,使用递推的思想来做,重复的子问题可以不重复计算。
3.状态表示:用问题的某些特征参数描述当前的问题。
4:状态转移方程: f(n,m)=max{f(n-1,m), f(n-1,m-w[n])+A(n,m)}(视题目要求而稍有变动),即为状态值之间的递推关系,使用自顶向下或者自底向上的方法,记忆化搜索的过程。
本题解题思路:(最经典也是最简单的dp)
本题由于高层的状态计算依赖底层的状态,所以采用自底向上的方法,先计算最底层的f(n,x),再计算f(n-1,x)-->...-->f(1,1)。状态转移方程为:dp[i][j]+=max(dp[i+1][j],dp[i+1][j+1])。
其中计算之后的dp[i][j]的值表示在输入dp[i+1][j]和dp[i+1][j+1]中较大的一个值加上它原本dp[i][j]的值。
代码:
#include <iostream>#include <cstdio>#include <cstring>using namespace std;int max(int a,int b) //也可以直接使用max函数,加上 algorithm 这个头文件就好{ return (a>b?a:b);}int main(){ int t; scanf("%d",&t); while(t--) { int n; int dp[105][105]; memset(dp,0,sizeof(dp)); scanf("%d",&n); //输入就不说了 for(int i=1; i<=n; i++) for(int j=1; j<=i; j++) scanf("%d",&dp[i][j]); for(int i=n-1; i>0; i--) //i从n-1开始计算,因为dp[n-1]记录的就是最底层的数值 { for(int j=1; j<=i; j++) { dp[i][j]+=max(dp[i+1][j],dp[i+1][j+1]); //依次相加,计算当前状态加上下一层左、右两个数值较大的一个值保存 } } printf("%d\n",dp[1][1]); //最终状态 } return 0;}
0 0
- hdu 2048 数塔 (最经典也是最简单的dp)
- hdu 2084 数塔 最基础DP
- 最简单也是最实用的-批处理(一)
- 最简单也是最实用的-批处理(二)
- 最简单也是最实用的-批处理(三)
- 最简单也是最实用的-批处理(四)
- 最简单 也是最容易犯的错误
- MySQL:最简单,也是最容易犯错的sql问题
- 【经典算法】:蛇形填数,最简单的方法了。。。
- hdu 2084 数塔(水) 经典简单DP
- HDU 2048 数塔 简单DP
- hdu 2039 最经典的入门题
- 线性表是最基本、最简单、也是最常用的一种数据结构。
- 0-1背包(最简单也是最难的背包问题)
- 01背包最简单最经典的入门题
- 经典DP HDU 2084 数塔
- HDU 数塔 (dp入门经典)
- hdu 2084(数塔-经典dp)
- Rxjava2单元测试的异步和同步转换
- MDK中问题:warning : type qualifier is meaningless on cast type return 的解决
- jdbc连接,方便自己查阅
- 【Android】去除小数点后多余的零
- 新手老手一起来!AngularJS 第二讲-深入基本语法
- hdu 2048 数塔 (最经典也是最简单的dp)
- remove-duplicates-from-sorted-list
- Sony S1512S2C加装内存
- linux目录权限与文件权限的区别
- CCF201412-2 Z字形扫描(解法二)(100分)
- angular js 入门2 $watch 监听事件
- 十大编程算法助程序员走上高手之路
- 【Android】退出多个Activity方法(二)
- Common Subsequence(dp)HDU 1159