http://poj.org/problem?id=3176

树塔问题,求最大和

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;

#define N 360
#define max(a,b) (a)>(b)?(a):(b)

int s[N][N];
int c[N][N];
int n;

int shuta(int i,int j)
{
if(s[i][j]==-1)
s[i][j]=i==n?c[i][j]:max(shuta(i+1,j)+c[i][j],shuta(i+1,j+1)+c[i][j]);
return s[i][j];
}

int main()
{
int i,j;
while(scanf("%d",&n)!=EOF)
{
memset(s,-1,sizeof(s));
for(i=0;i<n;i++)
{
for(j=0;j<=i;j++)
scanf("%d",&c[i][j]);
}
printf("%d\n",shuta(0,0));
}
return 0;
}
#include<cstdio>
#include<iostream>
using namespace std;

#define N 360

int c[N][N];
int s[N][N];

int shuta(int n)
{
int i,j;
for(i=1;i<=n;i++)
s[n][i]=c[n][i];
for(i=n;i>1;i--)
{
for(j=1;j<i;j++)
{
if(s[i][j]>s[i][j+1])
s[i-1][j]=s[i][j]+c[i-1][j];
else
s[i-1][j]=s[i][j+1]+c[i-1][j];
}
}
return s[1][1];
}

int main()
{
int i,j,n;
while(scanf("%d",&n)!=EOF)
{
for(i=1;i<=n;i++)
{
for(j=1;j<=i;j++)
scanf("%d",&c[i][j]);
}
printf("%d\n",shuta(n));
}
return 0;
}

第二种为备忘录法


posted on 2012-02-25 18:13  pcoda  阅读(174)  评论(0编辑  收藏  举报