几乎没问题,第31个数据点WA了
查看原帖
几乎没问题,第31个数据点WA了
511229
Optics楼主2024/7/1 15:13

码风应该还不错

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1005;
int n;
int t,dp2[N][N],dp5[N][N];
int num2[N][N],num5[N][N];
int Map[N][N];
int x,y,ans;
int tmp;
void print(int i,int j,bool k){
	if(i == 1 && j == 1){
		if(k)
			cout << 'D';
		else
			cout << 'R';
		return;
	}
	if(i == 1)
		print(i,j-1,0);
	else if(j == 1)
		print(i-1,j,1);
	else if(tmp == 0 && dp2[i][j] == dp2[i][j-1] + num2[i][j] || tmp == 1 && dp5[i][j] == dp5[i][j-1] + num5[i][j]) 
		print(i,j-1,0);
	else
		print(i-1,j,1);
	if(i != n || j != n)
		if(k)
			cout << 'D';
		else
			cout << 'R';
}
signed main(){
	cin >> n;
	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= n; j++){
			cin >> Map[i][j];
			t = Map[i][j];
			
			if(t == 0){
				tmp = i;	
				num2[i][j] = num5[i][j] = 1;
				continue;
			}
			
			while(t % 2 == 0){
				t /= 2;
				num2[i][j] ++;
			}
			while(t % 5 == 0){
				t /= 5;
				num5[i][j] ++;
			}
		}
	}
	
	for(int i = 1; i <= n; i++){
		dp2[i][0] = dp2[0][i] = INT_MAX;
		dp5[i][0] = dp5[0][i] = INT_MAX;
	}
	dp2[1][1] = num2[1][1];
	dp5[1][1] = num5[1][1];
	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= n; j++){
			if(i == 1 && j == 1) continue;
			dp2[i][j] = min(dp2[i][j-1],dp2[i-1][j]) + num2[i][j];
		}
	}
	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= n; j++){
			if(i == 1 && j == 1) continue;
			dp5[i][j] = min(dp5[i][j-1],dp5[i-1][j]) + num5[i][j];
		}
	}
	
//	cout << dp2[3][2] << " " << dp5[n][n]<< endl;
	ans = min(dp2[n][n],dp5[n][n]);
	if(ans > 1 && tmp){
		cout << 1 << endl;
		for(int i = 1; i < tmp; i++)
			cout << "R";
		for(int i = 1; i < n; i++)
			cout << "D";
		for(int i = tmp; i < n; i++)
			cout << "R";
	}
	
	else{
		cout << ans << endl;
		tmp = !(dp2[n][n] < dp5[n][n]);
		print(n,n,0);
	}
	return 0;
}

2024/7/1 15:13
加载中...