• 蓝桥杯2020.7月真题走方格(到达终点的不同方案数)(记忆化搜索+DP)


    ACwing评测地址:https://www.acwing.com/problem/content/description/2069/

    1:记忆化搜索:

    #include<bits/stdc++.h>
    #include<cmath>
    #include<map>
    #define pb push_back
    using namespace std;
    typedef long long ll;
    const int maxn=2e5+10;
    int mp[40][40];
    int f[40][40];
    int n,m, cnt=0;
    int dfs(int x,int y)
    {
        if(x%2!=0||y%2!=0)
        {
            if(f[x][y])return f[x][y];
            if(x<n)
                f[x][y]+=dfs(x+1,y);
            if(y<m)
                f[x][y]+=dfs(x,y+1);
        }
        return f[x][y];
    }
    int main()
    {
        cin>>n>>m;
        if(n%2!=0||m%2!=0)
            f[n][m]=1;
        cout<<dfs(1,1)<<endl;
    
    }

    2:DP:

    f[i][j]表示到达i,j的方案数。

    转移方程:f[i][j]=f[i-1][j]+f[i][j-1];

    特判,f[0][1]=1或者f[1][0]=1都可以,少了这个,全体都是0了。

    #include<bits/stdc++.h>
    #include<cmath>
    #include<map>
    #define pb push_back
    using namespace std;
    typedef long long ll;
    const int maxn=2e5+10;
    int mp[40][40];
    int f[40][40];
    int n,m;
    int main()
    {
        cin>>n>>m;
        f[0][1]=1;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                if(i%2==0&&j%2==0)
                    continue;
                f[i][j]=f[i-1][j]+f[i][j-1];
            }
        }
        cout<<f[n][m]<<endl;
    }
  • 相关阅读:
    标准函数头部注释
    排序
    #define _INTSIZEOF(n)
    并发编程资料
    memory model
    Ubuntu搜狗输入法的使用
    gprof
    xml_editor
    创建本地Ubuntu镜像
    设计模式9:建造者模式
  • 原文地址:https://www.cnblogs.com/liyexin/p/13805782.html
Copyright © 2020-2023  润新知