中小型网站建设与管理,安阳网站seo,wordpress的文章采集,网站如何做优化C - Digital Path 计蒜客 - 42397
题意#xff1a;
题意就是给出一个n ∗ m的数字矩阵每个矩阵元素之间只能上下左右走#xff0c;而且下一个位置必须比当前位置的数字大1#xff0c;入口和出口必须数边缘元素#xff0c;求可以有多少条路径。
题解#xff1a;
第一反…C - Digital Path 计蒜客 - 42397
题意
题意就是给出一个n ∗ m的数字矩阵每个矩阵元素之间只能上下左右走而且下一个位置必须比当前位置的数字大1入口和出口必须数边缘元素求可以有多少条路径。
题解
第一反应dfsdfs记忆化搜索剪枝 vis[x][y]1表示这个点能作为dfs的起点
代码:
#includebits/stdc.h
using namespace std;
typedef long long ll;
const int mod1e97;
const int maxn1e69;
int vis[2000][2000];
int n,m;
int a[2000][2000];
int dp[2000][2000];
int dx[]{0,1,0,-1};
int dy[]{1,0,-1,0};
int sum0;
bool f0;
inline int dfs(int x,int y,int tot)
{if(dp[x][y])return dp[x][y];dp[x][y]0;ll ans0;int pp0;for(int i0;i4;i){int newxxdx[i];int newyydy[i];if(newxn||newx1||newym||newy1)continue;if(a[newx][newy]a[x][y]1){pp1;ansansdfs(newx,newy,tot1);ansans%mod;} }if(tot4pp0)//如果长度大于4且已走到头 {return 1; }dp[x][y]ans;return dp[x][y]%mod;
}
int main()
{scanf(%d%d,n,m);for(int i1;in;i){for(int j1;jm;j){scanf(%d,a[i][j]);}}memset(vis,0,sizeof(vis));for(int i1;in;i){for(int j1;jm;j){for(int k0;k4;k){int newxidx[k];int newyjdy[k];if(newxn||newx1||newym||newy1)continue;if(a[newx][newy]a[i][j]-1){vis[i][j]1;}}}}ll ans0;for(int i1;in;i){for(int j1;jm;j){if(vis[i][j]0){dp[i][j]dfs(i,j,1);ansansdp[i][j];ansans%mod;}}}coutans%mod;
}