原址连接ios
时间限制:10000ms
单点时限:1000ms
内存限制:256MB算法
小Hi和小Ho在经历了螃蟹先生的任务以后被奖励了一次出国旅游的机会,因而他们来到了大洋彼岸的美国。美国人民的生活很是有意思,常常会有形形色色、奇奇怪怪的活动举办,这不,小Hi和小Ho刚刚下飞机,就遇上了当地的迷宫节活动。迷宫节里展览出来的迷宫都特别的有意思,可是小Ho却相中了一个其实并不怎么像迷宫的迷宫——由于这个迷宫的奖励很是丰富~测试
因而小Ho找到了小Hi,让小Hi帮助他获取尽量多的奖品,小Hi把手一伸道:“迷宫的介绍拿来!”优化
小Ho选择的迷宫是一个被称为“数字三角形”的n(n不超过200)层迷宫,这个迷宫的第i层有i个房间,分别编号为1..i。除去最后一层的房间,每个房间都会有一些通往下一层的房间的楼梯,用符号来表示的话,就是从第i层的编号为j的房间出发会有两条路,一条通向第i+1层的编号为j的房间,另外一条会通向第i+1层的编号为j+1的房间,而最后一层的全部房间都只有一条离开迷宫的道路。这样的道路都是单向的,也就是说当沿着这些道路前往下一层的房间或者离开迷宫以后,小Ho没有办法再次回到这个房间。迷宫里同时只会有一个参与者,而在每一个参与者进入这个迷宫的时候,每一个房间里都会生成必定数量的奖券,这些奖券能够在经过迷宫以后兑换各类奖品。小Ho的起点在第1层的编号为1的房间,如今小Ho悄悄向其余参与者弄清楚了每一个房间里的奖券数量,但愿小Hi帮他计算出他最多能得到多少奖券。spa
提示一:盲目贪心不可取,搜索计算太耗时
提示二:记忆深搜逞神威,宽度优先解难题
提示三:总结概括提公式,减小冗余是真理code
每一个测试点(输入文件)有且仅有一组测试数据。递归
每组测试数据的第一行为一个正整数n,表示这个迷宫的层数。内存
接下来的n行描述这个迷宫中每一个房间的奖券数,其中第i行的第j个数表明着迷宫第i层的编号为j的房间中的奖券数量。ci
测试数据保证,有100%的数据知足n不超过100get
对于100%的数据,迷宫的层数n不超过100
对于100%的数据,每一个房间中的奖券数不超过1000
对于50%的数据,迷宫的层数不超过15(小Ho表示2^15才3万多呢,也就是说……)
对于10%的数据,迷宫的层数不超过1(小Hi很好奇你的边界状况处理的如何?~)
对于10%的数据,迷宫的构造知足:对于90%以上的结点,左边道路通向的房间中的奖券数比右边道路通向的房间中的奖券数要多。
对于10%的数据,迷宫的构造知足:对于90%以上的结点,左边道路通向的房间中的奖券数比右边道路通向的房间中的奖券数要少。
对于每组测试数据,输出一个整数Ans,表示小Ho能够得到的最多奖券数。
样例输入
5
2
6 4
1 2 8
4 0 9 6
6 5 5 3 6
样例输出
28
一道简单的动态规划运用题。
动态规划是一种对于递归算法的优化方法,典型的用空间换取时间思想。
第一步:分析问题,写出递归式。递归中每每存在着对于同一个子问题的重复计算,这是动态规划的着手点。
第二步:作好递归算法的条件分析,在计算结果时对于未计算过的问题进行存储,对于已经计算过的问题直接使用存储的结果。
#include <iostream> using namespace std; #define max2(a,b) ((a)>(b)?(a):(b)) #define max3(a,b,c) ((a)>(max2((b),(c)))?(a):(max2((b),(c)))) #define abs(a) ((a)>0?(a):(-(a))) #define MAX 100000 #define MATRIXSIZE 201 int best[MATRIXSIZE][MATRIXSIZE]; // Note down the process solution. int maze[MATRIXSIZE][MATRIXSIZE]; int n; void initial_matrix() { for(int i=0;i<MATRIXSIZE;i++){ for(int j=0;j<MATRIXSIZE;j++) best[i][j] = MAX; } } // For test: void print_maz() { for(int i=0;i<n;i++){ for(int j=0;j<n-i;j++)cout<<' '; for(int j=0;j<=i;j++) cout<<maze[i][j]<<' '; cout<<endl; } } int get_best(int i, int j) { if(best[i][j]!=MAX) { return best[i][j]; } else{ if(i==0) { best[0][0]=maze[0][0]; return best[0][0]; } else if(j==0) { best[i][j] = get_best(i-1, j) + maze[i][j]; return(best[i][j]); } else if(j>0){ best[i][j] = max2(get_best(i-1,j-1), get_best(i-1, j)) + maze[i][j]; return(best[i][j]); } } } int main() { initial_matrix(); cin>>n; for(int i=0;i<n;i++) { for(int j=0;j<=i;j++) cin>>maze[i][j]; } int biggest=0; for(int k=0;k<n;k++) { int best_at_ij = get_best(n-1,k); if(best_at_ij>biggest) biggest=best_at_ij; } cout<<biggest<<endl; return 0; }