问题描述
刷微博,编程序。如下图所示,@北京发布 提出了如下“头脑震荡”问题。对此问题做一般化描述:
有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
思路:我们要明白这几点:
从(n-1,0)位置开始搜索
终止的条件有:
到达(0,n-1)的位置
走的路线长度等于2*n-1
满足这两点的同时要让路线的总值最大,方案数加一
代码:
#include <iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int kk[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
int flag[100][100];
int f=0,k=0;
int n;
void dfs(int a[][100],int x,int y,int route,int sum)
{
if(route>2*n-1)
return;
if(flag[x][y]==1)
return;
if(x==0&&y==n-1)
{
if(route!=2*n-1)
{
return;
}
}
if(route==2*n-1)
{
if(x==0&&y==n-1)
{
if(sum>f)
{
f=sum;
k=1;
}
else if(sum==f)
k++;
}
else
return;
}
flag[x][y]=1;
for(int i=0;i<4;i++)
{
int dx,dy;
dx=x+kk[i][0];
dy=y+kk[i][1];
if(dx>=0&&dx<n&&dy>=0&&dy<n&&flag[dx][dy]==0)
{
route++;
sum+=a[dx][dy];
//cout<<a[dx][dy]<<" ";
//cout<<endl;
dfs(a,dx,dy,route,sum);
sum-=a[dx][dy];
flag[dx][dy]=0;
route--;
}
}
}
int main()
{
int a[100][100];
cin>>n;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cin>>a[i][j];
}
}
memset(flag,0,sizeof(flag));
dfs(a,n-1,0,1,a[n-1][0]);
cout<<k<<" "<<f<<endl;
return 0;
}