題目大意: \(2 \times n\) 大小的方格矩陣,某些格子不能走,走過的格子不能走。從任意點出發,一次最多走多少次?
首先有一個貪心的思想,每次從最左走到最右,只能向上下右走,不能向左走(因為向左走一定不會讓步數更多)。
動態規劃,設 \(f_{i,j}\) 表示從每個連通塊走到 \((i,j)\) 的最大格子數,其中 \(i \in \{1,2\}\),則有:
\[f_{0,i}=\max
\left\{\begin{aligned}
&f_{0,i-1}\\
&f_{1,i}
\end{aligned}\right.
\]
\[f_{1,i}=\max
\left\{\begin{aligned}
&f_{1,i-1}\\
&f_{0,i}
\end{aligned}\right.
\]
注意後面那一項需要同時計算,即不能用 \(f_{1,i}\) 更新 \(f_{0,i}\) 後又用 \(f_{0,i}\) 更新 \(f_{1,i}\)。
具體見程式碼:
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=1e6+5;
int n,f[2][N],ans;
char grid[2][N];
bool g[2][N];
int main()
{
scanf("%d",&n);
scanf("%s%s",grid[0]+1,grid[1]+1);
for(int i=0;i<=1;i++)
for(int j=1;j<=n;j++)
g[i][j] = grid[i][j]=='R'; //1能走,0不能走
for(int i=1;i<=n;i++)
{
if(g[0][i]) f[0][i]=max(f[0][i],f[0][i-1]+1);
if(g[1][i]) f[1][i]=max(f[1][i],f[1][i-1]+1);
int f0i=f[0][i],f1i=f[1][i];
if(g[0][i]) f[0][i]=max(f[0][i],f1i+1);
if(g[1][i]) f[1][i]=max(f[1][i],f0i+1);
ans=max(ans,max(f[0][i],f[1][i]));
}
printf("%d\n",ans ? ans-1 : 0);
return 0;
}