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; }