1.题目信息(http://poj.org/problem?id=1163)
The Triangle
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 30397 | Accepted: 17973 |
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
1.记忆递归型动归
#include <iostream>
#include <algorithm>
#define m 101
using namespace std;
int n;
int d[m][m];
int maxsum[m][m];
int MAXsum(int i,int j){
if(maxsum[i][j]!=-1){
return maxsum[i][j];
}
if(i==n)
{
maxsum[i][j]=d[i][j];
}
else{
int x=MAXsum(i+1,j);
int y=MAXsum(i+1,j+1);
maxsum[i][j]=max(x,y)+d[i][j];
}
return maxsum[i][j];
}
int main()
{
int i,j;
cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=i;j++){
cin>>d[i][j];
maxsum[i][j]=-1;
}
cout<<MAXsum(1,1)<<endl;
return 0;
}
2.递推
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int n;
int d[101][101];
int maxsun[101][101];
cin>>n;
for(int i=0;i<n;i++)
for(int j=0;j<=i;j++)
{
cin>>d[i][j];
}
for(int i=0;i<n;i++){
maxsun[n-1][i]=d[n-1][i];
//cout<<d[n-1][i];
}
for(int i=n-2;i>=0;i--)
for(int j=0;j<=i;j++)
maxsun[i][j]=max(maxsun[i+1][j],maxsun[i+1][j+1])+d[i][j];
cout<<maxsun[0][0]<<endl;
/*for(int i=0;i<n;i++){
for(int j=0;j<=i;j++)
{
cout<<maxsun[i][j];
}cout<<""<<endl;
}*/
return 0;
}
3.空间优化
#include <iostream>
#include <algorithm>
using namespace std;
#define m 101
int d[m][m];
int n;
int *maxsum;
int main()
{
int i,j;
cin>>n;
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
cin>>d[i][j];
maxsum =d[n];
for(i=n-1;i>=1;i--)
for(j=1;j<=i;j++)
maxsum[j]=max(maxsum[j],maxsum[j+1])+d[i][j];
cout<<maxsum[1]<<endl;
return 0;
}