题解 AT4529 【Grid 1】
Update:2021.1.4 炸了
本题明显可以用 DFS,并且不会 TLE。
但会 。
附上 DFS 代码:
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
string a[1005];
int H, W;
const int Mod = 1e9 + 7;
long long cnt = 0;
void dfs(const int& x, const int& y, long long cnts = 0)
{
if(a[x][y] == '#' || !(x >= 1 && x <= H && y >= 1 && y <= W)) return ;
dfs(x, y + 1);
dfs(x + 1, y);
cnts++;
if(x == H && y == W) cnt += cnts;
cnt %= Mod;
}
int main()
{
int m = 1, n = 1;
cin >> H >> W;
for(register int i = 1; i <= H; i++)
{
for(register int j = 1; j <= W; j++) cin >> a[i][j];
}
dfs(m, n);
cout << cnt % Mod << endl;
return 0;
}
递归多次导致栈溢出,。
这种题目我们更可以用 DP 做。
先给个转移方程:
那么这个转移方程怎么推出来的呢?
因为是往下或往右,所以对于每个 ,往下是 ,也就是列标不变,而往右是 ,行标不变,而我们是逆着推,就是从上面来或从左侧来,因此分别是 和 。
时间复杂度 。
代码:
#include <iostream>
using namespace std;
char a[1005][1005];
long long dp[1005][1005];
int H, W;
const int Mod = 1e9 + 7;
long long cnt = 0;
int main()
{
cin >> H >> W;
for(register int i = 1; i <= H; i++)
{
for(register int j = 1; j <= W; j++) cin >> a[i][j];
}
dp[1][1] = 1;
for(register int i = 1; i <= H; i++)
{
for(register int j = 1; j <= W; j++)
{
if(a[i][j] == '.')
{
dp[i][j] += dp[i][j - 1];
dp[i][j] += dp[i - 1][j];
dp[i][j] %= Mod;
}
}
}
cout << dp[H][W] << endl;
return 0;
}
要注意的是本题不能用 string 做,无论是 DP 还是 DFS,都会 ,猜测是由于 string 内存溢出吧$。

浙公网安备 33010602011771号