classSolution{public:intfindPaths(intm,intn,intmaxMove,intstartRow,intstartColumn){this->m=m;this->n=n;// dp[k][i][j] := # of paths to move the ball (i, j) out of bound w/ k movesdp.resize(maxMove+1,vector<vector<int>>(m,vector<int>(n,-1)));returnfindPaths(maxMove,startRow,startColumn);}private:constexprstaticintkMod=1'000'000'007;intm;intn;vector<vector<vector<int>>>dp;intfindPaths(intk,inti,intj){if(i<0||i==m||j<0||j==n)return1;if(k==0)return0;if(dp[k][i][j]!=-1)returndp[k][i][j];returndp[k][i][j]=((findPaths(k-1,i+1,j)+findPaths(k-1,i-1,j))%kMod+(findPaths(k-1,i,j+1)+findPaths(k-1,i,j-1))%kMod)%kMod;}};
classSolution{publicintfindPaths(intm,intn,intmaxMove,intstartRow,intstartColumn){this.m=m;this.n=n;// dp[k][i][j] := # of paths to move the ball (i, j) out of bound w/ k movesdp=newInteger[maxMove+1][m][n];returnfindPaths(maxMove,startRow,startColumn);}privatestaticfinalintkMod=1_000_000_007;privateintm;privateintn;privateInteger[][][]dp;privateintfindPaths(intk,inti,intj){if(i<0||i==m||j<0||j==n)return1;if(k==0)return0;if(dp[k][i][j]!=null)returndp[k][i][j];returndp[k][i][j]=((findPaths(k-1,i+1,j)+findPaths(k-1,i-1,j))%kMod+(findPaths(k-1,i,j+1)+findPaths(k-1,i,j-1))%kMod)%kMod;}}
classSolution{public:intfindPaths(intm,intn,intmaxMove,intstartRow,intstartColumn){constexprintkMod=1'000'000'007;constvector<int>dirs{0,1,0,-1,0};intans=0;// dp[i][j] := # of paths to move the ball (i, j) out of boundvector<vector<int>>dp(m,vector<int>(n));dp[startRow][startColumn]=1;while(maxMove--){vector<vector<int>>newDp(m,vector<int>(n));for(intr=0;r<m;++r)for(intc=0;c<n;++c)if(dp[r][c]>0)for(intk=0;k<4;++k){constintx=r+dirs[k];constinty=c+dirs[k+1];if(x<0||x==m||y<0||y==n)ans=(ans+dp[r][c])%kMod;elsenewDp[x][y]=(newDp[x][y]+dp[r][c])%kMod;}dp=move(newDp);}returnans;}};