数字金字塔解题报告

用二维数组记录数,每一个数a[i][k]对应的下两个数是a[i+1][k]和a[i+1][k+1]
队列数组也可以

记忆化搜索

从下往上讨论
DP==从下往下讨论

DP, f[i][k]从塔顶到此处的最大路径
引申滚动数组

 1 #include <cstdio>
 2 using namespace std;
 3 #define maxr 1001
 4 int a[maxr][maxr];
 5 bool f[maxr][maxr];
 6 int r;
 7 int max(int a, int b)
 8 {
 9     if(a>b)    return a;
10     return b;
11 }
12 void dfs(int i, int k)
13 {
14     if(i==r)    return;
15     if(f[i+1][k]==0)
16     {
17         dfs(i+1, k);
18         f[i+1][k]=1;
19     }
20     if(k<=i&&f[i+1][k+1]==0)
21     {
22         dfs(i+1, k+1);
23         f[i+1][k+1]=1;
24     }
25     a[i][k]+=max(a[i+1][k],a[i+1][k+1]);
26 }
27 int main()
28 {
29     int i, k;
30     scanf("%d", &r);
31     for(i=1; i<=r; i++)
32     {
33         for(k=1; k<=i; k++)
34         {
35             scanf("%d", &a[i][k]);
36         }
37     }
38     for(i=1; i<=r; i++)    f[r][i]=1;
39     dfs(1, 1);
40     printf("%d", a[1][1]);
41     return 0;
42 }

记忆化

 1 #include <cstdio>
 2 using namespace std;
 3 #define maxr 1001
 4 int max(int a, int b)
 5 {
 6     if(a>b)    return a;
 7     return b;
 8 }
 9 int a[maxr][maxr];
10 int main()
11 {
12     int r, i, k;
13     scanf("%d", &r);
14     for(i=1; i<=r; i++)
15     {
16         for(k=1; k<=i; k++)
17         {
18             scanf("%d", &a[i][k]);
19         }
20     }
21     for(i=r-1; i>=1; i--)
22     {
23         for(k=1; k<=i; k++)
24         {
25             a[i][k]+=max(a[i+1][k], a[i+1][k+1]);
26         }
27     }
28     printf("%d", a[1][1]);
29     return 0;
30 }

从下往上讨论

 1 #include <cstdio>
 2 using namespace std;
 3 #define maxr 1001
 4 int max(int a, int b)
 5 {
 6     if(a>b)    return a;
 7     return b;
 8 }
 9 int a[maxr][maxr];
10 int main()
11 {
12     int r, i, k, ans=0;
13     scanf("%d", &r);
14     for(i=1; i<=r; i++)
15     {
16         for(k=1; k<=i; k++)
17         {
18             scanf("%d", &a[i][k]);
19             a[i][k]+=max(a[i-1][k-1], a[i-1][k]);
20             ans=max(a[i][k], ans);
21         }
22     }
23     printf("%d", ans);
24     return 0;
25 }

DP, f[i][k]从塔顶到此处的最大路径

 1 #include <cstdio>
 2 using namespace std;
 3 #define maxr 1001
 4 int max(int a, int b)
 5 {
 6     if(a>b)    return a;
 7     return b;
 8 }
 9 int a[2][maxr];
10 int main()
11 {
12     int r, i, k, ans=0, ri, pi;
13     scanf("%d", &r);
14     for(i=1; i<=r; i++)
15     {
16         ri=i%2;
17         pi=!ri;
18         for(k=1; k<=i; k++)
19         {
20             scanf("%d", &a[ri][k]);
21             a[ri][k]+=max(a[pi][k-1], a[pi][k]);
22             ans=max(a[ri][k], ans);
23         }
24     }
25     printf("%d", ans);
26     return 0;
27 }

滚动数组

时间: 2024-12-13 08:40:43

数字金字塔解题报告的相关文章

hihoCoder 1037 数字三角形 最详细的解题报告

题目来源:hihoCoder 1037 数字三角形 解题思路:请好好看看 提示一.提示二.提示三 具体算法(java版,可以直接AC) import java.util.Scanner; public class Main { public static int[][] rewards; public static int[][] best; public static void main(String[] args) { Scanner scanner = new Scanner(System

USACO Section1.5 Number Triangles 解题报告

numtri解题报告 —— icedream61 博客园(转载请注明出处)------------------------------------------------------------------------------------------------------------------------------------------------[题目] 有一个数字的金字塔,形状如下    7   3 8  8 1 0 2 7 4 4 4 5 2 6 5 要从顶端开始走,每次只能向

1.5.1 Number Triangles 数字金字塔

★1.5.1 Number Triangles 数字金字塔 一.题目描述 考虑在下面被显示的数字金字塔. 写一个程序来计算从最高点开始在底部任意处结束的路径经过数字的和的最大. 每一步可以走到左下方的点也可以到达右下方的点. 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 在上面的样例中,从7 到 3 到 8 到 7 到 5 的路径产生了最大和:30 PROGRAM NAME: numtri 18 INPUT FORMAT 第一个行包含 R(1<= R<=1000) ,表示行的数目

2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告

2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告 勘误1:第6题第4个 if最后一个条件粗心写错了,答案应为1580. 条件应为abs(a[3]-a[7])!=1,宝宝心理苦啊.!感谢zzh童鞋的提醒. 勘误2:第7题在推断连通的时候条件写错了,后两个if条件中是应该是<=12 落了一个等于号.正确答案应为116. 1.煤球数目 有一堆煤球.堆成三角棱锥形.详细: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形). -. 假设一共

hdu 4956 Poor Hanamichi 解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4956(它放在题库后面的格式有一点点问题啦,所以就把它粘下来,方便读者观看) 题目意思:给出一个范围 [l, r] 你, 问是否能从中找到一个数证明 Hanamichi’s solution 的解法是错的. Hanamichi’s solution 是这样的: 对于某个数 X,从右往左数它的每一位数字(假设第一位是从0开始数).它 偶数位的数字之和 -  奇数位的数字之和  = 3  而且 这个 X

【百度之星2014~初赛(第二轮)解题报告】JZP Set

声明 笔者最近意外的发现 笔者的个人网站http://tiankonguse.com/ 的很多文章被其它网站转载,但是转载时未声明文章来源或参考自 http://tiankonguse.com/ 网站,因此,笔者添加此条声明. 郑重声明:这篇记录<[百度之星2014~初赛(第二轮)解题报告]JZP Set>转载自 http://tiankonguse.com/ 的这条记录:http://tiankonguse.com/record/record.php?id=668 前言 最近要毕业了,有半年

【百度之星2014~资格赛解题报告】

声明 笔者最近意外的发现 笔者的个人网站http://tiankonguse.com/ 的很多文章被其它网站转载,但是转载时未声明文章来源或参考自 http://tiankonguse.com/ 网站,因此,笔者添加此条声明. 郑重声明:这篇记录<标题>转载自 http://tiankonguse.com/ 的这条记录:http://tiankonguse.com/record/record.php?id=666 前言 最近要毕业了,有半年没做比赛了.这次参加百度之星娱乐一下.现在写一下解题报

解题报告——-2018级2016第二学期第三周作业

解题报告——2018级2016第二学期第三周作业 A:[NOIP2002P]过河卒 题目: 描述 如图,A 点有一个过河卒,需要走到目标 B   点.卒行走规则:可以向下.或者向右.同时在棋盘上的任一点有一个对方的马(如上图的C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点.例 如上图 C  点上的马可以控制 9 个点(图中的P1,P2 … P8 和 C).卒不能通过对方马的控制点. 棋盘用坐标表示,A 点(0,0).B 点(n,m)(n,m 为不超过 20  的整数,并由键盘输入)

洛谷OJ P1045 麦森数 解题报告

洛谷OJ P1045 麦森数 解题报告 by MedalPluS   题目描述 形如2P-1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果P是个素数,2P-1不一定也是素数.到1998年底,人们已找到了37个麦森数.最大的一个是P=3021377,它有909526位.麦森数有许多重要应用,它与完全数密切相关. 任务:从文件中输入P(1000<P<3100000),计算2P-1的位数和最后500位数字(用十进制高精度数表示)   输入描述   文件中只包含一个整数P(1000&l