洛谷P1002,自己也踩过无数次坑才AC,现在总结一下。
这是一道·动态规划基础题,看到时第一感觉是用深搜,结果......
然后看见了算法标签,发现这是动态规划......
动态转移方程:dp[i][j]=dp[i-1][j]+dp[i][j-1]
就是来到点(i,j)的方案数=来到上面的点的方案树(i-1,j)+来到左边的点的方案数(i,j-1)。
注意要把点的坐标增加,我的是增加2,其实增加1也可以,主要是防止越界。
记住原点(0,0)的方案数是1,不然方程怎么推都是0。
AC代码:
#include<bits/stdc++.h>
using namespace std;
int n,m,x,y;
long long dp[40][40];
int dx[]={0,1},dy[]={1,0};
int mx[]={-2,-1,1,2,2,1,-1,-2},my[]={1,2,2,1,-1,-2,-2,-1};
bool safe[40][40];
int main(){
cin>>n>>m>>x>>y;
//变量一定要增加,不然会越界
x+=2;y+=2;n+=2;m+=2;
//采用bool数组存储这个点是否安全
//记得马的位置也是不安全的
safe[x][y]=true;
for(int i=0;i<8;i++){
safe[x+mx[i]][y+my[i]]=true;
}
//开始dp
dp[2][2]=1;
for(int i=2;i<=n;i++){
for(int j=2;j<=m;j++){
if(!safe[i][j]&&!(i==2&&j==2)){
dp[i][j]=dp[i-1][j]+dp[i][j-1];
}
}
}
cout<<dp[n][m];
return 0;
}
附上AC图:
这是我第一次写博客,难免会出错,多多见谅。