The Triangle
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 50846 | Accepted: 30789 |
Description
7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 (Figure 1)
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思想就很简单了,从上往下层层叠加,不断更新最大值,自己画画就清楚了。
搜索代码:
#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;
}
对于这个题来说两者耗时差不多。