蓝桥杯-算法提高-最大值路径-DFS+DP

蓝桥杯-算法提高-最大值路径-DFS+DP

  • 问题描述
      刷微博,编程序。如下图所示,@北京发布 提出了如下“头脑震荡”问题。对此问题做一般化描述:
      有n阶方阵,从矩阵的左下角元素为起点,从行或列(水平或垂直)两个方向上移动,直到右上角。求出有多少条路径可以使得经过的元素累加值最大,最大值是多少。
    在这里插入图片描述
  • 输入格式
      共有n+1行。
      第一行整数n,表示矩阵的阶数,2<=n<=10。
      第二行起,每行n个整数,以空格分隔,共n行。。
    输出格式
      一行,两个空格分隔的数,第一个表示最大值路径的条数,第二个表示最大值。
  • 样例输入
    5
    4 5 4 5 6
    2 6 5 4 6
    2 6 6 5 2
    4 5 2 2 5
    5 2 5 6 4
  • 样例输出
    3 47
  • 解题思路
    参考 算法提高——最大值路径!!
    1.求使经过的元素累加值最大。
    要想使累加值最大,每一步经过的元素值就得选最大值。
    起点:dp[n][1] //左下角
    dp[i][j-1]:往左走
    dp[i+1][j]:往下走
    i=n,在最后一行时,dp[i][j]=dp[i][j-1]+a[i][j];//往右走
    j=1,在最后一列时,dp[i][j]=dp[i+1][j]+a[i][j];//往上走
    不在最后一行也不在最后一列,中间过程行走时,
    dp[i][j]=max(dp[i][j-1],dp[i+1][j])+a[i][j];
    2.求有多少条路径可以使得经过的元素累加值最大。
    有起点、终点,用深度优先搜索DFS。
    以右上角(1,n)作为出发点,
    只有当dp[i][j-1]和dp[i+1][j]相等时,路径才会增加一条;
    否则的话,继续搜索dfs(x+1,y)或者dfs(x,y-1),直到达到边界或出界,直接退出。
  • AC的代码:
#include<iostream>
#include<cstring>
using namespace std;
int n; 
int ans=1;//初始化:至少有一条最大路径 ☆ 
int a[12][12];//存放矩阵 
int dp[12
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值