数字三角形(动态规划)poj1163
来源:互联网 发布:iphone吉他调音软件 编辑:程序博客网 时间:2024/06/10 08:13
问题描述
有一个由非负整数组成的三角形,第一行只有一个数,除了最下行之外每个数的左下方和右下方各有一个数,从第一行的数开始,每次可以往左下和右下走一格,直到走到最下行,把沿途经过的数全部加起来,如何才能使这个和最大??
状态转移方程由来的分析
需要用抽象的方法思考问题:把当前的位置(i,j)看成一个状态,然后定义状态(i,j)的指标函数d(i,j)为从格子(i,j)出发时能得到的最大和(包括(i,j)本身的值)。在这个状态定义下,原问题的解为d(1,1).
从格子(i,j)出发有两种决策,往左下走或者往右下走,应选择d(i+1,j),d(i+1,j+1)中较大的那一个,即
d(i,j)=(i,j)+max{d(i+1,j),d(i+1,j+1)}
记忆化搜索与递推
!!注意边界处理:即i=n时
记忆化搜索
虽然不像递推法那样显示的指明了计算顺序,但可保证每个节点只访问一次,时间复杂度为o(n^2)
首先用“menset(d,-1,sizeof(d));”把d全部初始化为-1,然后编写递归函数
<php>int solve(int i,int j){if(d[i][j]!=-1) return d[i][j]; return d[i][j]=a[i][j]+(i==n?0:max(solve(i+1,j),solve(i+1,j+1))); }
上述程序依然是递归的,但同时也把计算结果保存在数组d中。题目中说各个数都是非负的,只需把所有d初始化为-1,即可通过判断得知它是否已经被计算过。
递推计算
可以用递推法计算状态转移方程。递推的关键是边界和计算顺序。在多数情况下,地推的时间复杂度是状态总数每个状态的决策个数决策时间
时间复杂度同记忆化搜索
int i,j;for(j=1;j<=n;j++) d[n][j]=a[n][j];for(i=n-1;i>=1;i--) for(j=1;j<=i;j++) d[i][j]=a[i][j]+max(d[i+1][j],d[i+1][j+1]);
可以这样计算的原因是 i是逆序枚举的,因此在计算d[i][j]前,它所需要的d[i+1][j]和d[i+1][j+1]一定已经计算出来了。
OK来看典型例题
简单点直接贴代码
#include<cstdio>#include<iostream>#include<algorithm>int dp[105][105];int n;using namespace std;int main(){int i,j; while(scanf("%d",&n)!=EOF){for(i=1;i<=n;i++) {for( j=1;j<=i;j++) {scanf("%d",&dp[i][j]);} } int DP(); printf("%d\n",DP());}return 0;}int DP(){ int i,j;for(int i=n-1;i>=1;i--){ for(j=1;j<=i;j++) { dp[i][j]+=max(dp[i+1][j],dp[i+1][j+1]); }}return dp[1][1];}
1 0
- 数字三角形(动态规划)poj1163
- 动态规划--(数字三角形 poj1163)
- 动态规划--再论(数字三角形 poj1163)
- 动态规划 数字三角形 poj1163
- 数字三角形动态规划poj1163
- POJ1163 The Triangle(数字三角形) (动态规划初步)
- 动态规划略有所得 数字三角形(POJ1163)
- 动态规划——POJ1163数字三角形问题
- [PKU暑课笔记] 动态规划 POJ1163数字三角形
- poj1163(数字三角形)
- 数字三角形(动态规划)
- 数字三角形(动态规划)
- 数字三角形(动态规划)
- 数字三角形(动态规划)
- POJ1163-The Triangle(数字三角形)
- 数字三角形(POJ1163)
- DP 数字三角形(POJ1163)
- POJ1163数字三角形
- 从AP微积分看美国的微积分教育
- XSS跨站总结
- js最少知识原则
- Thymeleaf字面量
- Kruskal,最小生成树,树链剖分,LCA(邦德,UVA 11354)
- 数字三角形(动态规划)poj1163
- MySQL学习之主从配置及读写分离详解
- .Net程序员学用Oracle系列(14):子查询、集合查询
- mysql中一些常用操作
- 用cxf做基于spring的web service开发(八)
- 算法训练 排序
- 机器学习&深度学习资料分享
- Android输入系统(一)
- LeakCanary——直白的展现Android中的内存泄露