POJ 1163The Triangle(dp或记忆化搜索)

来源:互联网 发布:传奇荣耀辅助软件 编辑:程序博客网 时间:2024/06/05 09:27

The Triangle
Time Limit: 1000MS Memory Limit: 10000KTotal Submissions: 50846 Accepted: 30789

Description

73   88   1   02   7   4   44   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

573 88 1 0 2 7 4 44 5 2 6 5

Sample Output

30


记忆化搜索确实比较垃圾,但是他确实dp的本质,搜索嘛。这里一定记忆下到每个点最大值,都这就没有意义了。

dp思想就很简单了,从上往下层层叠加,不断更新最大值,自己画画就清楚了。

搜索代码:

#include<cstdio>#include<iostream>#include<algorithm>#include<queue>#include<stack>#include<cstring>#include<string>#include<vector>#include<map>using namespace std;#define mem(a,b) memset(a,b,sizeof(a))typedef long long ll;const int maxn = 1e3+5;const int ff = 0x3f3f3f3f;int n;int mp[maxn][maxn];int dp[maxn][maxn];int fs(int x,int y){if(x == n)return mp[x][y];if(dp[x][y]!= -1)return dp[x][y];//已经记录过最大值了直接返回就好了int max1 = fs(x+1,y);int max2 = fs(x+1,y+1);dp[x][y] = max(max1,max2)+mp[x][y];return dp[x][y];}int main(){int t;mem(dp,-1);scanf("%d",&n);for(int i = 1;i<= n;i++)for(int j = 1;j<= i;j++)scanf("%d",&mp[i][j]);printf("%d\n",fs(1,1));return 0;}

dp代码:

#include<cstdio>#include<iostream>#include<algorithm>#include<queue>#include<stack>#include<cstring>#include<string>#include<vector>#include<map>using namespace std;typedef long long ll;const int maxn = 1e3+5;const int ff = 0x3f3f3f3f;int dp[maxn][maxn];int n;int main(){memset(dp,0,sizeof(dp)) ;scanf("%d",&n);for(int i = 1;i<= n;i++)for(int j = 1;j<= i;j++)scanf("%d",&dp[i][j]);int maxx = -1;for(int i = 1;i<= n;i++)for(int j = 1;j<= i;j++){dp[i][j] = max(dp[i-1][j]+dp[i][j],dp[i-1][j-1]+dp[i][j]);if(dp[i][j]> maxx)maxx = dp[i][j];}printf("%d\n",maxx);return  0;}

对于这个题来说两者耗时差不多。

更多精写文章