蓝桥杯-算法提高-最大值路径-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][