题目:蓝桥杯——走方格
思路:常见的dfs写法,判断注意题目条件的限制;
代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 35;
int n,m,ans;
int a[N][N],f[N][N];
int xx[] = {0,1},yy[] = {1,0}; //这里只需要遍历两个方向
void dfs(int x,int y)
{
f[x][y] = 1;
if(x == n && y == m)
{
ans++;
return ;
}
for(int i = 0; i < 2 ; i++)
{
int a = x + xx[i];
int b = y + yy[i];
if(a % 2 == 0 && b % 2 == 0) continue;
if(a >= 1 && a <=n && b >= 1 && b <= m && f[a][b] == 0)
{
f[a][b] = 1;//标记为走过了
dfs(a,b);//然后再往下遍历
f[a][b] = 0;//接着标记为未走过
}
}
}
int main()
{
cin>>n>>m;
dfs(1,1);
cout<<ans;
}
题目:数字三角形
思路 :dp写法,从上往下遍历,比较两个走法的大小并储存,最后遍历最后一行找到最大值
代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 105;
int n,ans;
int a[N][N],f[N][N];//
int l[N][N],r[N][N];//定义两个数组来储存两边走的距离
int main()
{
cin>>n;
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= i; j++)
{
cin>>a[i][j];
}
}
for(int i = 1 ; i <= n; i++)
{
for(int j = 1 ; j <= i; j++)
{
if(i == 1)//对第一行初始化
{
f[i][j] = a[i][j];
}
else {
//定义的时候一定跟当前的状态相加才会准确
int x = f[i - 1][j] + a[i][j];//定义x为往左下走
int y = f[i - 1][j - 1] + a[i][j];//定义y为往右下走
if(x >= y)//比较两个状态的分别大小
{
l[i][j] = l[i - 1][j] + 1;//距离加一
r[i][j] = r[i - 1][j];//距离不变
f[i][j] = x;//状态更新
}//往右下
else {
l[i][j] = l[i - 1][j - 1];
r[i][j] = r[i - 1][j - 1] + 1;
f[i][j] = y;
}
}
}
}
int ans = -5;
for(int i = 1; i <= n ; i++)
{
if(ans < f[n][i] && (abs(l[n][i] - r[n][i]) <= 1) )//遍历每一种可能,找到最大值
{
ans = f[n][i];
}
}
cout<<ans;
}