hdu2084 数塔 记忆化搜索水题
2016-06-23 20:50
459 查看
数塔 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 33327 Accepted Submission(s): 19904 Problem Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少? 已经告诉你了,这是个DP的题目,你能AC吗? Input 输入数据首先包括一个整数C,表示测试实例的个数,每个测试实例的第一行是一个整数N(1 <= N <= 100),表示数塔的高度,接下来用N行数字表示数塔,其中第i行有个i个整数,且所有的整数均在区间[0,99]内。 Output 对于每个测试实例,输出可能得到的最大和,每个实例的输出占一行。 Sample Input 1 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 Sample Output 30 Source 2006/1/15 ACM程序设计期末考试
来源: http://acm.hdu.edu.cn/showproblem.php?pid=2084
状态方程 d(i,j) = a(i,j) + max{ d(i+1,j),d(i+1,j+1) } //------------------------------------------------------非递归写法未超时---------------------------------------------------//#include <iostream> #include <cstdio> #include <map> #include <cstdlib> #include <cmath> #include <algorithm> #include <cstring> using namespace std; int A[101][101],N; int D[101][101]; int Cal(int i,int j) { if(D[i][j]>=0) return D[i][j]; else return D[i][j] = A[i][j] + (i==N? 0:max(Cal(i+1,j),Cal(i+1,j+1))); } int main() { //freopen("F:\\test.txt","r",stdin); int T;cin>>T; for(int i=1;i<=T;i++) { memset(D,-1,sizeof(D));cin>>N; for(int j=1;j<=N;j++) for(int k=1;k<=j;k++) cin>>A[j][k]; cout<<Cal(1,1)<<endl; } return 0; }
/***********************************递归写法超时|*****************************************/ #include <cstdio> #include <cstring> #define high 100 int A[high+1][high+1]; int B[high+1][high+1]; int MAX(int High,int i) { return B[High][i]>=B[High][i+1]?B[High][i]:B[High][i+1]; } int Cal(int High) { for(int i=1;i<=High;i++) B[High][i]=(MAX(High+1,i)+A[High][i]); if(High==1) return B[1][1];//顶部边界 else return Cal(High-1); } int Handle(int N) { for(int i=1;i<=N;i++) for(int j=1;j<=i;j++) scanf("%d",&A[i][j]); for(int i=1;i<=N;i++) B [i]=A [i];//设置边界 return Cal(N-1);//从第倒数第二层向下找 } int main() { int T;scanf("%d",&T); for(int i=1,N;i<=T&&scanf("%d",&N);i++) { printf("%d\n",Handle(N)); /* for(int i=1;i<=N;i++) { for(int j=1;j<=i;j++) printf("%I64d ",B[i][j]); putchar('\n'); }*/ } return 0; }
相关文章推荐
- C++STL之vector
- 安卓开发中非常炫的效果集合
- HDU 3530 单调队列
- HDU 1003Max Sum 动态规划 经典题 最大子序列和
- 神经网络和深度学习简史(四):深度学习终迎伟大复兴
- HDU 1231 最大连续子序列
- APP测试点总结(功能,交互,死机崩溃状态分析,容易出错的检查点)
- Jira 安装与破解
- HDU1257 最少拦截系统 贪心算法 (多人乘船问题)水题
- myeclipse10运用git过程
- BZOJ_1616_[Usaco2008_Mar]_Cow_Travelling_游荡的奶牛_(DP)
- A*算法
- 排序 水题
- 讯飞语音开发之语音理解
- HDU 5091 扫描线,线段树
- ViewTreeObserver理解
- 【SpringMVC学习07】SpringMVC中的统一异常处理
- android自定义颜色进度条ColorSeekBar
- BZOJ 2432 兔农
- 简析iOS动画原理及实现——Core Animation