http://poj.org/problem?id=1163
以我的理解,他们这是对递归的重计算问题的优化,从而演变成的另一种算法;
一般只能计算最大或最小问题;
一下是我的代码;
前一个是递归;
后一个是动态规划;
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int sizen=150;
int a[sizen][sizen];
int mat[150][150];
int n;
int Max(int i,int j)
{
if(i==n)
return mat[i][j];
else
{
if(a[i][j]!=-1)
return a[i][j];
int x=Max(i+1,j);
int y=Max(i+1,j+1);
a[i][j]=max(x,y)+mat[i][j];
return a[i][j];
}
}
int main()
{
int i,j;
while(scanf("%d",&n)!=EOF)
{
memset(a,-1,sizeof(a));
memset(mat,0,sizeof(mat));
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
scanf("%d",&mat[i][j]);
printf("%d\n",Max(1,1));
}
return 0;
}
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<iostream>
using namespace std;
const int sizen=150;
int arr[sizen];
int mat[sizen][sizen];
int main()
{
int n;
int i,j;
while(scanf("%d",&n)!=EOF)
{
memset(arr,0,sizeof(arr));
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
scanf("%d",&mat[i][j]);
for(i=n;i>=1;i--)
for(j=1;j<=i;j++)
arr[j]=mat[i][j]+max(arr[j],arr[j+1]);
printf("%d\n",arr[1]);
}
return 0;
}