数塔问题:
求解从第一行的第一个数值开始到达最后一行的最后一个数值结束,只能走一条路径,路径连起来的所有数值之和最大值是多少!
递归DFS搜索:
#includeiostreamusingnamespacestd;intn;//定义从上往下一共多少行intm=0;//定义并且初始化最大值为0inta[][];//参数i代表当前行,j代表当前列,s代表当前所经路径值之和voiddfs(inti,intj,ints){//边界:到最后一行停止if(i==n){//最大值选择if(sm){m=s;}return;}//向下走的时候,有两种选择//1、向左走dfs(i+1,j,s+a[i+1][j]);//2、向右走dfs(i+1,j+1,s+a[i+1][j+1]);}intmain(){cinn;//数塔的构造for(inti=1;i=n;i++){for(intj=1;j=i;j++){cina[j];}}dfs(1,1,a[1][1]);coutmendl;return0}
动态规划:
#includeiostreamusingnamespacestd;inta[][];//存放构造数塔数值intf[][]={0};//存放阶段性路径之和,初始化为0intn;intmain(){cinn;//数塔构造for(inti=1;i=n;i++){for(intj=1;j=i;j++){cina[j];}}f[1][1]=a[1][1];//自底向上动态规划推导for(inti=2;i=n;i++){for(intj=1;j=i;j++){//状态转移方程,也就是递推通式f[j]=a[j]+max(f[i-1][j-1],f[i-1][j]);}}//最大值暂定为0intm=0;//最后一行存放着所有路径的最大值for(inti=1;i=n;i++){if(f[n]m){m=f[n];}}coutmendl;return0;}一只小跃跃