数字三角形——动态转移方程
2015-08-22 12:08
453 查看
数字三角形问题。
7
3 8
8 1 0
2 7 7 4
5 5 2 6 5
数字三角形中的数字为不超过100的正整数。现规定从最顶层走到最底层,每一步可沿左斜线向下或右斜线向下走。假设三角形行数≤100,编程求解从最顶层走到最底层的一条路径,使得沿着该路径所经过的数字的总和最大,输出最大值。输入数据:由文件输入数据,文件第一行是三角形的行数N。以后的N行分别是从最顶层到最底层的每一层中的数字。
如输入:5 输出:30
7
3 8
8 1 0
2 7 7 4
5 5 2 6 5
状态转移方程 d(i,j)=a[i][j]+max{ d(i+1,j),d(i+1,j+1)}
递归计算
递推计算
7
3 8
8 1 0
2 7 7 4
5 5 2 6 5
数字三角形中的数字为不超过100的正整数。现规定从最顶层走到最底层,每一步可沿左斜线向下或右斜线向下走。假设三角形行数≤100,编程求解从最顶层走到最底层的一条路径,使得沿着该路径所经过的数字的总和最大,输出最大值。输入数据:由文件输入数据,文件第一行是三角形的行数N。以后的N行分别是从最顶层到最底层的每一层中的数字。
如输入:5 输出:30
7
3 8
8 1 0
2 7 7 4
5 5 2 6 5
状态转移方程 d(i,j)=a[i][j]+max{ d(i+1,j),d(i+1,j+1)}
递归计算
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; #define MAXN 100 int a[MAXN][MAXN]; int n; int _max(int a ,int b ) { return a>b?a:b; } int solve(int i,int j) { return a[i][j]+(i==n?0:_max( solve(i+1,j),solve(i+1,j+1) ) ); } int main() { int ans; cin>>n; for(int x=0;x<n;x++){ for(int y=0;y<x+1;y++){ scanf("%d",&a[x][y]); } } ans=solve(0,0); cout<<ans<<endl; return 0; }
递推计算
#include <iostream> #include <algorithm> using namespace std; #define MAXN 111 int dp[MAXN][MAXN]; int a[MAXN][MAXN]; int _max(int a ,int b ) { return a>b?a:b; } int main() { int n; int ans=0x80000000; cin >> n; for(int i=1; i<=n; i++) for(int j=1; j<=i; j++) cin >> a[i][j]; for(int i=1; i<=n; i++) for(int j=1; j<=i; j++) dp[i][j]=_max(dp[i-1][j-1],dp[i-1][j])+a[i][j]; for(int j=1; j<=n; j++) if(dp [j]>ans) ans = dp [j]; cout << ans; return 0; }
相关文章推荐
- [LeetCode]Single Number
- UICollectionview Xib 行间距
- V3版本微信支付
- 用户态 内核态
- ListView UI 混乱问题
- C++ 编程个人总结
- MySQLCluster安装配置(三)
- MySQLCluster安装配置(四)
- 数据库扫盲一(主键、外键)
- MySQLCluster安装配置(二)
- kphp框架网站开发之利用smarty模版生成网站地图sitemap全解
- 酷狗app高仿系列
- 【leetcode】53. Maximum Subarray
- 安装配置MySqlCluster
- Android:Notification的生成与取消
- 我的第一个shell脚本
- 为 URLDownloadToFile 实现进度条
- [LeetCode] N-Queens
- Android 自定义ActionBar
- CCF 最大的矩形