POJ 1163 The Triangle(三种搜索方式)
2015-08-15 08:51
211 查看
The Triangle
Description
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
(Figure 1)
Figure 1 shows a number triangle. Write a program that calculates the highest sum of numbers passed on a route that starts at the top and ends somewhere on the base. Each step can go either diagonally down to the left or diagonally down to the right.
Input
Your program is to read from standard input. The first line contains one integer N: the number of rows in the triangle. The following N lines describe the data of the triangle. The number of rows in the triangle is > 1 but <= 100. The numbers in the triangle,
all integers, are between 0 and 99.
Output
Your program is to write to standard output. The highest sum is written as an integer.
Sample Input
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
Sample Output
30
题意:给定一个三角形的数字表,求出定点到达最低点的最长的路(点上的值代表其长度)。
解题思路:这是个DP题,从下往上搜,一个点的要么从左边上来,要么从右边上来,所以每次将到达改点的最大值记录下来,状态转换方程为dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+dp[i][j];
最终输出dp[0][0]即为所求。
复杂度分析: 时间复杂度:o((n)^2)
空间复杂度:o(n^2)
从上往下搜: #include<iostream> #include<cstdio> #include<algorithm> #include<cmath> using namespace std; int main() { int n; while(scanf("%d",&n)==1) { int dp ; for(int i=0;i<n;i++) for(int j=0;j<=i;j++) scanf("%d",&dp[i][j]); for(int i=1;i<n;i++){ dp[i][0] += dp[i-1][0]; dp[i][i] +=dp[i-1][i-1]; } for(int i=2;i<n;i++) for(int j=1;j<=i-1;j++) dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+dp[i][j]; for(int i=1;i<n;i++) dp[n-1][0]=max(dp[n-1][0],dp[n-1][i]); cout << dp[n-1][0] << endl; } return 0; } 或者:从下往上搜 #include<iostream> #include<cstdio> #include<algorithm> #include<cmath> using namespace std; int main() { int n; while(scanf("%d",&n)==1) { int dp ; for(int i=0;i<n;i++) for(int j=0;j<=i;j++) cin>>dp[i][j]; for(int i=n-2;i>=0;i--) for(int j=0;j<=i;j++) dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+dp[i][j]; cout << dp[0][0] << endl; } return 0; } 或者记忆化搜索: #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> using namespace std; const int N=105; int dp ,a ; int dps(int x,int y){ int L,R; if(dp[x][y]>=0) return dp[x][y]; L=dps(x+1,y); R=dps(x+1,y+1); return dp[x][y]=max(L,R)+a[x][y]; } int main() { int n; while(scanf("%d",&n)==1) { memset(dp,-1,sizeof(dp)); for(int i=0;i<n;i++) for(int j=0;j<=i;j++) scanf("%d",&a[i][j]); for(int i=0;i<n;i++) dp[n-1][i]=a[n-1][i]; dps(0,0); cout << dp[0][0] << endl; } return 0; }
相关文章推荐
- Android屏幕适配全攻略(最权威的官方适配指导)
- 初识Javascript的面向对象
- 华为OJ平台试题 —— 字符串:名字的漂亮度
- POJ 2029
- 补丁比较工具Darun Grim使用
- SDUT 1265-马停下过河卒(DFS)
- 拷贝构造函数与赋值函数的区别
- 基于 SurfaceView 详解 android 幸运大转盘,附带实例app
- 如何驱蚊最有效
- 如何更新 Linux 内核来提升系统性能
- 车速的码和迈是什么意思 ?和千米的对比是怎么换算的?
- 15.1——面向对象概述,基类与派生类
- R - 变化plot字形,嵌入字体以pdf
- 斑点检测
- spring mvc 控制器方法传递一些经验对象的数组
- POJ 3268 Silver Cow Party(最短路dijkstra)
- LeetCode Power of Two
- LeetCode Power of Two
- hdu5358
- hdu5358