第二个点 WA 在第 2136 行。思路是用 dp[i[[j][0/1] 分别记录第 i 行第 j 列从左边走来和从上面走来的最大值。直接转移不知道哪里 WA 了。
#include<bits/stdc++.h>
using namespace std;
const int N = 1e2+10;
int n,m,a[N][N],dp[N][N][2];
int Getgcd(int a,int b,int c){
if((a == 0 || b == 0) && c == 0) return 0;
return a == 0 ? b : Getgcd(b%a,a,c+1);
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int T; cin>>T;
////cout<<Getgcd(0,25,0)<<endl;
while(T--){
cin>>n>>m;
for(int i = 1;i<=n;i++)
for(int j = 1;j<=m;j++)
cin>>a[i][j];
dp[1][1][1] = dp[1][1][0] = a[1][1];
for(int i = 2;i<=n;i++){
dp[i][1][0] = 0;
dp[i][1][1] = Getgcd(dp[i-1][1][1],a[i][1],0);
}
for(int i = 2;i<=m;i++){
dp[1][i][1] = 0;
dp[1][i][0] = Getgcd(dp[1][i-1][0],a[1][i],0);
}
for(int i = 2;i<=n;i++){
for(int j = 2;j<=m;j++){
dp[i][j][0] = dp[i][j][1] = 0;
dp[i][j][0] = max(Getgcd(dp[i][j-1][0],a[i][j],0),dp[i][j][0]);
dp[i][j][0] = max(Getgcd(dp[i][j-1][1],a[i][j],0),dp[i][j][0]);
dp[i][j][1] = max(Getgcd(dp[i-1][j][0],a[i][j],0),dp[i][j][1]);
dp[i][j][1] = max(Getgcd(dp[i-1][j][1],a[i][j],0),dp[i][j][1]);
}
}
/*for(int i = 1;i<=n;i++){
for(int j = 1;j<=m;j++){
cout<<dp[i][j][0]<<' ';
}
cout<<'\n';
}
for(int i = 1;i<=n;i++){
for(int j = 1;j<=m;j++){
cout<<dp[i][j][1]<<' ';
}
cout<<'\n';
}*/
cout<<max(dp[n][m][0],dp[n][m][1])<<endl;
}
return 0;
}