每周学习小结

题目:蓝桥杯——走方格

思路:常见的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;
 } 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值