HDU 2084 数塔(简单DP入门)
数塔
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 41852 Accepted Submission(s): 24820
Problem Description
在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?
已经告诉你了,这是个DP的题目,你能AC吗?
Input
输入数据首先包括一个整数C,表示测试实例的个数,每个测试实例的第一行是一个整数N(1 <= N <= 100),表示数塔的高度,接下来用N行数字表示数塔,其中第i行有个i个整数,且所有的整数均在区间[0,99]内。
Output
对于每个测试实例,输出可能得到的最大和,每个实例的输出占一行。
Sample Input
1
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
Sample Output
30
Source
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2084
分析:DP入门题,学长好像讲了DFS写法,没怎么听,下次补上!
1 #include<stdio.h>
2 int main()
3 {
4 int C,i,j,N;
5 int a[101][101];
6 while(scanf("%d",&C)==1)
7 {
8 while(C--)
9 {
10 scanf("%d",&N);
11 for(i=0;i<N;i++)
12 for(j=0;j<=i;j++)
13 scanf("%d",&a[i][j]);
14 for(i=N-1;i>=0;i--)
15 {
16 for(j=0;j<=i;j++)
17 {
18 if(a[i][j]+a[i-1][j]>a[i][j+1]+a[i-1][j])
19 a[i-1][j]=a[i][j]+a[i-1][j];
20 else
21 a[i-1][j]=a[i][j+1]+a[i-1][j];
22 }
23 }
24 printf("%dn",a[0][0]);
25 }
26 }
27 return 0;
28 }
以上这种是别人的想法,下面我来说说我对DP的理解!
解题思路: 用二维数组存放数字三角形。 D( r, j) : 第r行第 j 个数字(r,j从1开始算) MaxSum(r, j) : 从D(r,j)到底边的各条路径中, 最佳路径的数字之和。 问题:求 MaxSum(1,1) 典型的递归问题。 D(r, j)出发,下一步只能走D(r+1,j)或者D(r+1, j+1)。故对于N行的三角形: if ( r == N) MaxSum(r,j) = D(r,j) else MaxSum( r, j) = Max{ MaxSum(r+1,j), MaxSum(r+1,j+1) } + D(r,j)
并且每算出一个MaxSum(r,j)就保存起来,下次用 到其值的时候直接取用,则可免去重复计算。那么 可以用O(n 2 )时间完成计算。因为三角形的数字总 数是 n(n+1)/2!
下面给出我的代码:
1 #include <bits/stdc++.h>
2 using namespace std;
3 int dp[105][105];
4 int maxSum[105][105];
5 int n;
6 int MaxSum(int i,int j)
7 {
8 if(maxSum[i][j]!=-1)
9 return maxSum[i][j];
10 if(i==n)
11 maxSum[i][j]=dp[i][j];
12 else
13 {
14 int x=MaxSum(i+1,j);
15 int y=MaxSum(i+1,j+1);
16 maxSum[i][j]=max(x,y)+dp[i][j];
17 }
18 return maxSum[i][j];
19 }
20 int main()
21 {
22 int T;
23 while(cin>>T)
24 {
25 while(T--)
26 {
27 cin>>n;
28 for(int i=1;i<=n;i++)
29 for(int j=1;j<=i;j++)
30 {
31 cin>>dp[i][j];
32 maxSum[i][j]=-1;
33 }
34 cout<<MaxSum(1,1)<<endl;
35 }
36 }
37 return 0;
38 }
- hadoop: hive 1.2.0 在mac机上的安装与配置
- ASP.NET 5运行时升级到Beta5
- WordPress免插件仅代码实现“返回顶部、返回底部、评论”效果(样式二)
- jQuery/asp.net mvc DateTime 的处理
- WordPress主题下funtions.php的一段“恶意”代码
- eclipse/intellij idea 远程调试hadoop 2.6.0
- Jexus 5.8.2 正式发布为Asp.Net Core进入生产环境提供平台支持
- 区块链技术发展前景可观,银链原子链已开始投入正常交易
- 分布式服务框架 dubbo/dubbox 入门示例
- SmtpClient发送邮件遭遇The specified string is not in the form required for a subject.
- 彻底解决WordPress 中 半角全角字符转义 的问题
- 利用Spring的@Async异步处理改善web应用中耗时操作的用户体验
- Oracle中使用Entity Framework 6.x Code-First方式开发
- 边缘计算推动AI发展 未来能摆脱云计算吗?
- 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 数组属性和方法
- 原生JS在网页上复制的所有文字后面自动加上一段版权声明
- 使用宝塔docker安装为知笔记私有部署
- 第4天:美团点评2020校招测试方向笔试试卷分析
- Element-UI饿了么时间组件控件按月份周日期,开始时间结束时间范围限制参数
- 微信小程序flex布局
- 细数 TS 中那些奇怪的符号
- 安装RabbitMQ无法访问localhost:15672的管理界面解决
- koa中http服务与websocket服务共享端口
- 第23天:NLP实战(七)——中文新闻主题分类
- Swoole v4.5.3 版本发布
- .NET5.0 单文件发布打包操作深度剖析
- 使用ng-container标签在SAP Spartacus里插入UI
- 自定义SAP Spartacus Cart界面
- 还是只使用console.log()进行调试?好吧,其实还有更多。
- SNMP++: Transport is not supported