http://poj.org/problem?id=1163
考察点:递归的简单入门题
思路:先算出前n个的最大和,然后递归出maxsum(i,j)=max(maxsum(i+1,j),maxsum(i+1,j+1));如果不优化的话,会超时,所以有申请了pa[][];
提交状况:错了2次,都是没分清题意,返回时,应返回pa[][],我写成了a[][];
收获:又一次使用递归,加强了对递归的理解
经验:做题的时候,思路要专一,要清晰,不要受其他条件的影响
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
int a[120][120];
int pa[120][120];//用pa减少重复计算
int n;
int maxsum(int i,int j)
{
if(pa[i][j]!=-1)
return pa[i][j];//为子递归做准备,刚才写成了a[i][j]错了两次
if(i==n)
{
pa[i][j]=a[i][j];
}
else
{
int x=maxsum(i+1,j);
int y=maxsum(i+1,j+1);
int t=max(x,y)+a[i][j];
pa[i][j]=t;
}
return pa[i][j];
}
int main()
{
int i,j;
while(scanf("%d",&n)!=EOF)
{
memset(pa,-1,sizeof(pa));
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
scanf("%d",&a[i][j]);
printf("%d\n",maxsum(1,1));
}
return 0;}
用dp做就是非常简单的了
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
int a[120][120];
int n;
int main()
{
int i,j;
while(scanf("%d",&n)!=EOF)
{
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
scanf("%d",&a[i][j]);
for(i=n-1;i>=1;i--)
for(j=1;j<=i;j++)
a[i][j]+=max(a[i+1][j],a[i+1][j+1]);
printf("%d\n",a[1][1]);
}
return 0;
}
递归到动态规划的方法
:递归中有n个参数,就定义n维数组;数组的下标是递归函数的取值范围,数组元素的值就是递归函数的返回值,这样就可以从边界开始,逐步填充数组,相当于计算递归函数值的逆过程;