求份hack或证明我的做法是假的
查看原帖
求份hack或证明我的做法是假的
808222
Kotobuki_Tsumugi楼主2024/6/1 19:40

第二个点 WA 在第 2136 行。思路是用 dp[i[[j][0/1]dp[i[[j][0/1] 分别记录第 ii 行第 jj 列从左边走来和从上面走来的最大值。直接转移不知道哪里 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;
}
2024/6/1 19:40
加载中...