POJ 1163 The Triangle
2016-08-09 10:38
295 查看
题目大意:输入一个n层的三角形,第i层有i个数,求从第1层到第n层的所有路线中,怎样让和最大,并输出这个最大值。
规定:第i层的某个数只能连线走到第i+1层中与它位置相邻的两个数中的一个。
解题思路:本题是经典的动态规划题,要求出要求的最大值(最优)。我们可以转换为求任意数字的最大路线和,本题要求的最大值即:所有数字的最大路线和的最大值。比如,我们要求数字1的最大路线和,则最大路线是: 7->8->1,最大路线和就是16 。我们把三角记录在数组a中,把数字的最大路线和数组m中,则动态规划方程如下:dp[ i ][ j ] = max ( dp[ i -1][ j-1 ] +dp[ i-1][ j ] ) + a[ i ][ j ]
代码如下:
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> #include <map> #include <cmath> #include <queue> using namespace std; int vis[105][105]; int dp[105][105]; int n,cnt; int main() { while(~scanf("%d",&n)) { memset(dp,0,sizeof(dp)); cnt=0; for(int i=1;i<=n;i++) for(int j=1;j<=i;j++) scanf("%d",&vis[i][j]); for(int i=1;i<=n;i++) { for(int j=1;j<=i;j++) { if(i==1) dp[i][j]=vis[i][j]; else if(j==1) dp[i][j]=dp[i-1][j]+vis[i][j]; else if(j==i) dp[i][j]=dp[i-1][j-1]+vis[i][j]; else dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+vis[i][j];//重要动态方程 } } for(int i=1;i<n;i++) cnt=max(cnt,dp [i]);//求抵达n行的最大值 printf("%d\n",cnt); } return 0; }
END!!!!!!!!!!!!!!!!!!!
相关文章推荐
- POJ1163 The Triangle
- poj 1163 The Triangle
- POJ 1163 The Triangle(简单动态规划)
- 0808 poj#1163 The Triangle
- (转)POJ 1163 The Triangle 解题报告
- POJ 1163 The Triangle【DP】
- POJ 1163 The Triangle
- POJ 1163 The Triangle (简单线性dp)
- POJ 1163 The Triangle
- POJ 1163 The Triangle (动态规划)
- POJ 1163 The Triangle(DP)
- The Triangle--poj--1163
- poj 1163 The Triangle (动态规划入门题)
- POJ-1163-The Triangle-递推动规
- POJ1163-The Triangle
- POJ-1163-The Triangle
- 【原】 POJ 1163 The Triangle 三角形最大路径 动态规划 解题报告
- poj 1163-小白算法练习 The Triangle 动态规划
- POJ 1163 The Triangle 解题报告
- The Triangle - POJ 1163 水题