这几天搞递归,差点没被搞死,先来看看这道题:
一个二维数组例如:
1,2,3
4,5,6
7,8,9
从左上角到右下角,每次只能向下或者向左走一步,求能得到最大和。
代码如下:
#include
<
iostream
>
#include < vector >
using namespace std;
int getmaxpath(vector < vector < int > > list, int r, int l, int side);
int main()
{
int a[ 3 ][ 3 ] =
{{ 1 , 2 , 3 },
{ 4 , 5 , 6 },
{ 7 , 8 , 9 }};
vector < vector < int > > v;
for ( int i = 0 ; i < 3 ; ++ i) // 传二维数组太麻烦= =于是我偷懒传向量。
{
vector < int > temp;
for ( int j = 0 ; j < 3 ; ++ j)
{
temp.push_back(a[i][j]);
}
v.push_back(temp);
}
cout << getmaxpath(v, 0 , 0 , 3 ) << endl;
return 0 ;
}
int getmaxpath(vector < vector < int > > list, int r, int l, int side)
{
if ( r == l && l == side - 1 ) // 到了右下角返回这个数
{
return list[r][r];
}
else if (r == side - 1 ) // 到了下边界则返回该数右边所有数的和,因为只能往右走了
{
int temp = 0 ;
for ( int i = l; i < side ; ++ i)
temp += list[r][i];
return temp;
}
else if (l == side - 1 ) // 同上,只不过是到了右边界要返回下面所有数的和
{
int temp = 0 ;
for ( int i = r; i < side ; ++ i)
temp += list[i][l];
return temp;
}
int a,b;
a = getmaxpath(list,r + 1 ,l,side);
b = getmaxpath(list,r,l + 1 ,side);
return list[r][l] + a > b ? a:b; // 往下走和往右走两种情况中和最大的那种,加上本数返回
}
#include < vector >
using namespace std;
int getmaxpath(vector < vector < int > > list, int r, int l, int side);
int main()
{
int a[ 3 ][ 3 ] =
{{ 1 , 2 , 3 },
{ 4 , 5 , 6 },
{ 7 , 8 , 9 }};
vector < vector < int > > v;
for ( int i = 0 ; i < 3 ; ++ i) // 传二维数组太麻烦= =于是我偷懒传向量。
{
vector < int > temp;
for ( int j = 0 ; j < 3 ; ++ j)
{
temp.push_back(a[i][j]);
}
v.push_back(temp);
}
cout << getmaxpath(v, 0 , 0 , 3 ) << endl;
return 0 ;
}
int getmaxpath(vector < vector < int > > list, int r, int l, int side)
{
if ( r == l && l == side - 1 ) // 到了右下角返回这个数
{
return list[r][r];
}
else if (r == side - 1 ) // 到了下边界则返回该数右边所有数的和,因为只能往右走了
{
int temp = 0 ;
for ( int i = l; i < side ; ++ i)
temp += list[r][i];
return temp;
}
else if (l == side - 1 ) // 同上,只不过是到了右边界要返回下面所有数的和
{
int temp = 0 ;
for ( int i = r; i < side ; ++ i)
temp += list[i][l];
return temp;
}
int a,b;
a = getmaxpath(list,r + 1 ,l,side);
b = getmaxpath(list,r,l + 1 ,side);
return list[r][l] + a > b ? a:b; // 往下走和往右走两种情况中和最大的那种,加上本数返回
}