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维数组;数组的下标是递归函数的取值范围,数组元素的值就是递归函数的返回值,这样就可以从边界开始,逐步填充数组,相当于计算递归函数值的逆过程;