过河卒
洛谷P1002
题面就不贴了吧,第一眼看直接是暴力深搜。
结果直接T了
然后看了一下,考虑了时间复杂度太高了,还有也没有很有效的剪枝。
贴一下我的dfs
#include <iostream> using namespace std; int n, m, a, b; int dir1[8] = { 1,1,2,2,-1,-1,-2,-2}; int dir2[8] = {2,-2,1,-1,2,-2,1,-1}; long long ans; int mp[30][30]; void dfs(int x, int y) { if(x>n||y>m) return ; if(mp[x][y]==1) return ; if(x==n&&y==m) { ans++; return ; } dfs(x+1, y); dfs(x, y+1); } int main() { cin >> n >> m >> a >> b; mp[a][b]=1; for(int i=0;i<8;i++) { int dx = a + dir1[i]; int dy = b + dir2[i]; mp[dx][dy] = 1; } dfs(0, 0); cout << ans << endl; }
然后我查了一下别人的代码,对啊!动态规划啊!到(x,y)只能是从(x-1,y)或者(x,y-1)啊。
F[I,J]=0{G[I,J]=1}
F[I,0]=F[I-1,0]{I>0,G[I,0]=0}
F[0,J]=F[0,J-1]{J>0,G[0,J]=0}
然后一发。
动态规划还是牛逼啊。
#include <iostream> using namespace std; int n, m, a, b; int dir1[8] = {1,1,2,2,-1,-1,-2,-2}; int dir2[8] = {2,-2,1,-1,2,-2,1,-1}; long long dp[30][30]; int mp[30][30]; int main() { cin >> n >> m >> a >> b; mp[a][b]=1; for(int i=0;i<8;i++) { int dx = a + dir1[i]; int dy = b + dir2[i]; mp[dx][dy] = 1; } for(int i=0;i<=n;i++) { for(int j=0;j<=m;j++) { if(mp[i][j]==1) { dp[i][j] = 0; } else { if(i==0&&j==0) { dp[i][j] = 1; continue; } if(i==0) { dp[i][j] = dp[i][j-1]; continue; } if(j==0) { dp[i][j] = dp[i-1][j]; continue; } dp[i][j] = dp[i-1][j] + dp[i][j-1]; } } } cout << dp[n][m] << endl; }