0
点赞
收藏
分享

微信扫一扫

poj1163&&luogu1216 number triangles


​​http://www.elijahqi.win/archives/471​​​
最近开始恶补动态规划才发现自己对动态规划掌握一直不到位,在老师带着练习的时候已经差不多会写简单一点的记忆化搜索了,但是当数据范围大的时候,我们的栈空间会不够用,导致溢出什么的。不妨从这篇文章开始从新学习一下动态规划好了的

来看一道题poj1163似乎滕老师当时教过我们写记忆化搜索的

有些图片来源于其他blog

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

首先,肯定得用二维数组来存放数字三角形

然后我们用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[i][j]=D[i][j];
}else maxsum[i][j]=max(maxsum[i+1][j],maxsum[i+1][j+1])+D[i][j]
可以根据此写出记忆化搜索的程序,或者朴素的搜索

下面我们不满足于这个空间的要求,我们来考虑正向递推

现在开始分析倒数第二行的每一个数,现分析数字2,2可以和最后一行4相加,也可以和最后一行的5相加,但是很显然和5相加要更大一点,结果为7,我们此时就可以将7保存起来,然后分析数字7,7可以和最后一行的5相加,也可以和最后一行的2相加,很显然和5相加更大,结果为12,因此我们将12保存起来。以此类推。。我们可以得到下面这张图:

然后按同样的道理分析倒数第三行和倒数第四行,最后分析第一行,我们可以依次得到如下结果:

洛谷数据稍微大一点开到1100就可以过了

#include<cstdio>
#define N 1100
inline int max(int x,int y){
return x>y?x:y;
}
int f[N][N],map[N][N],n;
int main(){
freopen("poj1163.in","r",stdin);
scanf("%d",&n);
for (int i=1;i<=n;++i)
for (int j=1;j<=i;++j) scanf("%d",&map[i][j]);
for (int i=1;i<=n;++i) f[n][i]=map[n][i];
for (int i=n-1;i>=1;--i)
for (int j=1;j<=i;++j) f[i][j]=max(f[i+1][j],f[i+1][j+1])+map[i][j];
printf("%d\n",f[1][1]);
return 0;
}



举报

相关推荐

0 条评论