dfs40分求助!!!

P1002 [NOIP2002 普及组] 过河卒

用dfs会超时,建议用dp。
by Noby_Gld @ 2021-10-11 13:13:57


QωQ
by housenhan @ 2021-10-11 13:15:10


这个dfs肯定会超时,时间复杂度为4^400,建议使用dp,AC代码:```c #include<iostream> #include<cstdio> using namespace std; long long B[21][21]; int n,m,a,b; void init(){ for(int i=0;i<=n;i++){ for(int j=0;j<=m;j++){ B[i][j]=1; } } if(a-2>=0&&b-1>=0) B[a-2][b-1]=0; if(a-2>=0&&b+1<=m) B[a-2][b+1]=0; if(a-1>=0&&b-2>=0) B[a-1][b-2]=0; if(a-1>=0&&b+2<=m) B[a-1][b+2]=0; if(a+1<=m&&b-2>=0) B[a+1][b-2]=0; if(a+2<=n&&b-1>=0) B[a+2][b-1]=0; if(a+1<=n&&b+2<=m) B[a+1][b+2]=0; if(a+1<=n&&b+1<=m) B[a+2][b+1]=0; B[a][b]=0; } int main(){ scanf("%d%d%d%d",&n,&m,&a,&b); init(); for(int i=0;i<=n;i++){ for(int j=0;j<=m;j++){ if(B[i][j]!=0){ if(i==0&&j==0){ continue; }else if(i==0){ B[i][j]=B[i][j-1]; }else if(j==0){ B[i][j]=B[i-1][j]; }else{ B[i][j]=B[i-1][j]+B[i][j-1]; } } } } printf("%lld\n",B[n][m]); } ```
by herobrine_wqh @ 2021-10-16 23:43:06


|