dp入门--poj 1163数塔

The Triangle










Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 36138   Accepted: 21615

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

Your program is to read from standard input. The
first line contains one integer N: the number of rows in the triangle. The
following N lines describe the data of the triangle. The number of rows in the
triangle is > 1 but <= 100. The numbers in the triangle, all integers, are
between 0 and 99.

Output

Your program is to write to standard output. The
highest sum is written as an integer.

Sample Input

5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

Sample Output

30

Source

IOI
1994

试想一下:
这道题如果用枚举法(暴力思想) ,在数塔层数稍大的情况下(如 31) ,则需要列举出的路 径条数将是一个非常庞大的数目(2^30=
1024^3 > 10^9=10亿) 。
考虑一下:
从顶点出发时到底向左走还是向右走应取决于是从左走能取到最大值还是从右走能取
到最大值,只要左右两道路径上的最大值求出来了才能作出决策。 同样,下一层的走向又要取决于再下一层上的最大值是否已经求出才能决策。这样一层
一层推下去,直到倒数第二层时就非常明了。 如数字2,只要选择它下面较大值的结点 19 前进就可以了。所以实际求解时,可从底 层开始,层层递进,最后得到最大值。

结论:自顶向下的分析,自底向上的计算。

dp方程:

i == n(最后一行)

sum[n][j] = num[n][j];

i != n

sum[i][j] = max(sum[i+1][j],sum[i+1][j+1]) +
num[i][j];

代码:

 1 #include<cstdio>
2 #include<cstring>
3 #include<cmath>
4 #include<algorithm>
5 using namespace std;
6 int main(){
7 int num[104][104],sum[104][104],n;
8 scanf("%d",&n);
9 memset(num,0,sizeof(num));
10 memset(sum,0,sizeof(sum));
11 for(int i = 1; i <= n; i ++){
12 for(int j = 1; j <= i; j ++){
13 scanf("%d",&num[i][j]);
14 }
15 }
16 for(int j = 1; j <= n; j ++)
17 sum[n][j] = num[n][j];
18 for(int i = n-1; i >= 1; i --)
19 for(int j = 1; j <= i; j ++){
20 sum[i][j] = max(sum[i+1][j],sum[i+1][j+1]) + num[i][j];
21 }
22 printf("%d\n",sum[1][1]);
23 return 0;
24 }

时间: 2024-10-29 12:37:50

dp入门--poj 1163数塔的相关文章

hdu 2084 &amp; POJ 1163 数塔 (dp)

数塔 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 24626    Accepted Submission(s): 14814 Problem Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少

POJ 1163 数塔 — 基础DP

The Triangle Time Limit: 1000 MS Memory Limit: 10000 KB 64-bit integer IO format: %I64d , %I64u Java class name: Main Description 73 88 1 02 7 4 44 5 2 6 5 (Figure 1) Figure 1 shows a number triangle. Write a program that calculates the highest sum o

HDOJ1176 免费馅饼 【DP】+【经典数塔】

免费馅饼 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 23986    Accepted Submission(s): 8093 Problem Description 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的1

G - 免费馅饼 HDU 1176 (动态规划---数塔的变形 )

G - 免费馅饼 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1176 Description 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼.说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的10米范围内.馅饼如果掉在了地上当然就不能吃了,所以gameboy马上卸下身上的背包去接.但由

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算法的时候,一个经典的例子就是数塔问题,它是这样描述的:有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?

HDU 2084 数塔 --- 入门DP

HDU 2084 数塔 从下往上递推,状态转移方程 dp[i][j] = max( dp[i+1][j], dp[i+1][j+1]) + a[i][j]; /* HDU 2084 数塔 --- 入门DP */ #include <cstdio> const int N = 105; int dp[N][N]; int MAX(int a, int b){ return a > b ? a : b; } int main() { #ifdef _LOCAL freopen("D

POJ 3176 Cow Bowling 保龄球 数塔问题 DP

题目链接:POJ 3176 Cow Bowling Cow Bowling Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14044   Accepted: 9310 Description The cows don't use actual bowling balls when they go bowling. They each take a number (in the range 0..99), though,

DP入门数塔问题

在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的:        有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?        已经告诉你了,这是个DP的题目,你能AC吗? Input 输入数据首先包括一个整数C,表示测试实例的个数,每个测试实例的第一行是一个整数N(1 <= N <= 100),表示数塔的高度,接下来用N行数字表示数塔,其中第i行有个i个整数,且所有的整数均在区间[0,99]内. Output 对于每个测试

HDU 1619 &amp; UVA 116 Unidirectional TSP(树形dp,入门 , 数塔变形)

Unidirectional TSP Description Background Problems that require minimum paths through some domain appear in many different areas of computer science. For example, one of the constraints in VLSI routing problems is minimizing wire length. The Travelin