POJ1163(简单的DP)
题目链接:http://poj.org/problem?id=1163
Description
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5 (Figure 1)
Figure 1 shows a number triangle. Write a program that calculates the highest sum of numbers passed on a route that starts at the top and ends somewhere on the base. Each step can go either diagonally down to the left or diagonally down to the right.
Input
Output
Sample Input
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
Sample Output
30
题意:在上面的数字三角形中寻找一条从顶部到底边的路径,使得 路径上所经过的数字之和最大。路径上的每一步都只能往左下或 右下走。只需要求出这个最大和即可,不必给出具体路径。三角形的行数大于1小于等于100,数字为 0 - 99
解题思路:我们可以用二维数组存放数字三角形。map( i, j) : 第i行第 j 个数字(i,j从1开始算).它是一个典型的递归问题。 map(i, j)出发,下一步只能走map(i+1,j)或者map(i+1, j+1)。但是如果采用递规的方法,深度遍历每条路径,存在大 量重复计算。则时间复杂度为 2^n,对于 n = 100 行,肯定超时。这里我们可以采用两种方法,第一种是采用记忆搜索的方法,如果每算出一个数组就保存起来,下次用 到其值的时候直接取用,则可免去重复计算。第二种是我们可以从下往上看,因为从顶边到底边的路径是和从底边到顶边的路径是一样的。我们把从第n行到第i行第j列位置的最大数字和设为dp[i][j],它肯定是底层到第i+1行的第j列的数字和即dp[i+1][j]或者到第i+1行第j+1列的数字和即dp[i+1][j+1]加上一个map[i][j]得得到的,根据动态规划的思想,我们应该去两者中更大的那个解即最优解,于是我们就能得到递推公式(即状态转移方程):dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+map[i][j],这样我们通过从最底层一步一步向上递推就很简单了,而我们要求的答案也正是最顶层的最优解即dp[1][1].
初学DP,如有不正确的地方,望指正,谢谢。
附上代码:
#include<iostream>
#include<cstdio>
#include<string.h>
using namespace std;
int n;
int map[][];
int dp[][]; int main()
{
cin>>n;
for(int i=;i<=n;i++){
for(int j=;j<=i;j++){
cin>>map[i][j];
}
}
memset(dp,,sizeof(dp));
for(int i=n;i>;i--)
{
for(int j=;j<=i;j++)
{
dp[i][j]=max(dp[i+][j],dp[i+][j+])+map[i][j];
}
}
cout<<dp[][]<<endl;
return ;
}
POJ1163(简单的DP)的更多相关文章
- HDU 2089 简单数位dp
1.HDU 2089 不要62 简单数位dp 2.总结:看了题解才敲出来的,还是好弱.. #include<iostream> #include<cstring> #i ...
- HDU 3853LOOPS(简单概率DP)
HDU 3853 LOOPS 题目大意是说人现在在1,1,需要走到N,N,每次有p1的可能在元位置不变,p2的可能走到右边一格,有p3的可能走到下面一格,问从起点走到终点的期望值 这是弱菜做的第 ...
- zju 2972 Hurdles of 110m(简单的dp)
题目 简单的dp,但是我还是参考了网上的思路,具体我没考虑到的地方见代码 #include<stdio.h> #include<iostream> #include<st ...
- 简单概率dp(期望)-zoj-3640-Help Me Escape
题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4808 题目大意: 有n条路,选每条路的概率相等,初始能力值为f,每 ...
- Aeroplane chess(简单概率dp)
Hzz loves aeroplane chess very much. The chess map contains N+1 grids labeled from 0 to N. Hzz start ...
- 简单Dp----最长公共子序列,DAG最长路,简单区间DP等
/* uva 111 * 题意: * 顺序有变化的最长公共子序列: * 模板: */ #include<iostream> #include<cstdio> #include& ...
- FZU - 2204 简单环形dp
FZU - 2204 简单环形dp 题目链接 n个有标号的球围成一个圈.每个球有两种颜色可以选择黑或白染色.问有多少种方案使得没有出现连续白球7个或连续黑球7个. 输入 第一行有多组数据.第一行T表示 ...
- poj 2342 Anniversary party 简单树形dp
Anniversary party Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3862 Accepted: 2171 ...
- hdu4705 Y 简单树形DP 2013多校训练第十场 J题
题意:求一棵树中不在一条链中的三个点的对数. 转化一下,用总对数减去在一条链上的三点对数即可. 考虑经过根节点,然后可能是不同的子树中各选一个:或者是子树中选一个,然后当前节点为根的子树以外的节点选一 ...
随机推荐
- CrackMe-005全破详解(图文+源码)--上篇
逆向破解 | 逆向 | 逆向分析 | CrackMe | Crack | CrackMe5 | CrackMe05 前言 CrackMe005,都说比较变态,很多人给放过去了,但是我还是决定上了它,既 ...
- Docker网络解决方案 - Weave部署记录
前面说到了Flannel的部署,今天这里说下Docker跨主机容器间网络通信的另一个工具Weave的使用.当容器分布在多个不同的主机上时,这些容器之间的相互通信变得复杂起来.容器在不同主机之间都使用的 ...
- db2修改最大连接数
查看当前连接数,sample为数据库名db2 list applications for db sample db2 list applications for db sample show deta ...
- hots团队项目终审报告
一.团队成员: 徐钧鸿: 1994年1月19日生人,摩羯座最后一天.所以有摩羯的强迫症和水瓶古怪的性格 暂且算队长吧…… 高中的时候因为兴趣学了竞赛,于是就入坑了,于是就来北航学计算机了 兴趣面很广, ...
- Linux内核分析第四章读书笔记
第四章 进程调度 进程调度程序:确保进程能有效工作的一个内核子程序 决定将哪个进程投入运行,何时运行已经运行多长时间 进程调度程序可看做在可运行态进程之间分配有限的处理器时间资源的内核子系统 原则:只 ...
- sho
手工编程:hello world 全部用命令行工具和Notepad编辑器,用手工创建并编译一个C的命令行程序:hello world. public class Hello{ publ ...
- Particle filter for visual tracking
Kalman Filter Cons: Kalman filtering is inadequate because it is based on the unimodal Gaussian dist ...
- np.array与np.ndarray区别
(Numpy中ndarray和array的区别是什么?我在哪儿能够找到numpy中相应的实现?) 答:Well, np.array is just a convenience function to ...
- js和JQuery区别
this.class="btn-default btn-info"; $(this).toggleClass("btn-default btn-info"); ...
- Java设计模式之工厂模式(Factory模式)介绍(转载)
原文见:http://www.jb51.net/article/62068.htm 这篇文章主要介绍了Java设计模式之工厂模式(Factory模式)介绍,本文讲解了为何使用工厂模式.工厂方法.抽象工 ...