hduoj-2084 数字塔问题 DP
来源:互联网 发布:linux怎么退出vi 编辑:程序博客网 时间:2024/05/01 16:10
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2084
还是按照之前的步骤,大概写,再精化。
典型的不能再典型的DP问题,最优子结构和重叠子问题性质都满足的很好。
使用DP求解,一开始在定义最大值的时候将1000写成000,导致了一系列完全不能理解的问题。
#include<iostream>#include<cstring>using namespace std;#define maxnum 1000int num[maxnum][maxnum];int d[maxnum][maxnum];int main(void){ int i,j,k; int n,m; cin>>n; while(n--){ cin>>m; for(i=1;i<=m;i++) for(j=1;j<=i;j++) cin>>num[i][j]; for(j=1;j<=m;j++) d[m][j]=num[m][j]; for(i=m-1;i>=1;i--) for(j=1;j<=i;j++) d[i][j]=num[i][j]+max(d[i+1][j+1],d[i+1][j]); cout<<d[1][1]<<endl; memset(d,0,sizeof(d)); }}
下面是使用备忘录方法(刘汝佳和我看到的外文书里都称之为记忆化搜索,个人感觉前者更好),
主函数变为
int f(int i,int j){ if (d[i][j]!=-1) return d[i][j]; else return d[i][j]=num[i][j]+(i==m?0:max(f(i+1,j),f(i+1,j+1))); //i==m的判断条件是非常重要的,否则就会数组越界}int main(void){ //使用备忘录方法来解决 int i,j,k; int n; cin>>n; while(n--){ memset(d,-1,sizeof(d)); cin>>m; for(i=1;i<=m;i++) for(j=1;j<=i;j++) cin>>num[i][j]; cout<<f(1,1)<<endl;}}注意的是在f()函数里else之后也要有return,否则f(1,1)是不会有返回的。都是一些编程方面容易忽视的问题。
0 0
- hduoj-2084 数字塔问题 DP
- HDUOJ 2084 数塔
- HDUOJ 2089 数位DP
- hduoj-1466【DP】
- hduoj-1501【dfs】【dp】
- 【dp】数字三角形问题
- [DP]取数字问题
- dp:数字三角形问题
- hduoj 2084
- 数字三角形问题(DP)
- DP 数字三角形+找钱问题
- POJ_1163_数字三角形问题(DP)
- 数字三角问题(dp)
- HDUOJ-1002: 大数字和的计算
- HDUOJ 1276 - 士兵队列训练问题
- HDUOJ 1005 Number Sequence(DP求公式)
- POJ 1163 数字三角形问题(DP)
- ACM 191. 取数字问题(dp)
- openssl生成私钥和公钥
- 公钥 私钥
- 第13周项目5(2)去除字符串空格
- Sublime Text 3 license 一个 供研究使用
- 内部类
- hduoj-2084 数字塔问题 DP
- linux下的patch补丁包实例详解以及diff命令实例。
- 装饰者模式 C++实现
- 第13周项目5(2)连接字符串仍存
- ARM七种异常源和异常处理流程(四大步三小步)
- ural2032
- Android - Application Context(应用程序上下文)
- 编译器的工作原理
- 列优先与行优先