#include<bits/stdc++.h>
using namespace std;
int dp[1001][1001];
struct num{
int t,f;
}k[1001][1001],c[1001][1001];
struct xy{
int x,y;
}f[1001][1001];
num solve(int x){
int s1=0,s2=0;
if (!x)
return {(int)1e9,(int)1e9};
while (!(x%2)){
++s1;
x>>=1;
}
while (!(x%5)){
++s2;
x/=5;
}
return {s1,s2};
}
void print(int x,int y){
if ((!(x-1))&&(!(y-1)))
return;
print(f[x][y].x,f[x][y].y);
cout<<((f[x][y].x==x-1)?'D':'R');
return;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n,m,y,l,l1,l2,p;
bool b=0;
cin>>n;
for (int i=1;i<=n;++i)
for (int j=1;j<=n;++j){
cin>>m;
if ((!b)&&(!m)){
b=1;
y=j;
}
k[i][j]=solve(m);
}
for (int i=1;i<=n;++i)
for (int j=1;j<=n;++j){
if ((i-1)&&(j-1)){
l1=min(k[i][j].t+c[i-1][j].t,k[i][j].f+c[i-1][j].f);
l2=min(k[i][j].t+c[i][j-1].t,k[i][j].f+c[i][j-1].f);
l=min(l1,l2);
p=min(dp[i-1][j]+l1,dp[i][j-1]+l2);
dp[i][j]=p;
if (p==dp[i-1][j]+l1){
c[i][j].t=c[i-1][j].t+k[i][j].t-dp[i][j]+dp[i-1][j];
c[i][j].f=c[i-1][j].f+k[i][j].f-dp[i][j]+dp[i-1][j];
f[i][j]={i-1,j};
}
else{
c[i][j].t=c[i][j-1].t+k[i][j].t-dp[i][j]+dp[i][j-1];
c[i][j].f=c[i][j-1].f+k[i][j].f-dp[i][j]+dp[i][j-1];
f[i][j]={i,j-1};
}
}
else if (i-1){
l=min(k[i][j].t+c[i-1][j].t,k[i][j].f+c[i-1][j].f);
dp[i][j]=dp[i-1][j]+l;
c[i][j].t=c[i-1][j].t+k[i][j].t-l;
c[i][j].f=c[i-1][j].f+k[i][j].f-l;
f[i][j]={i-1,j};
}
else if (j-1){
l=min(k[i][j].t+c[i][j-1].t,k[i][j].f+c[i][j-1].f);
dp[i][j]=dp[i][j-1]+l;
c[i][j].t=c[i][j-1].t+k[i][j].t-l;
c[i][j].f=c[i][j-1].f+k[i][j].f-l;
f[i][j]={i,j-1};
}
else{
dp[1][1]=min(k[1][1].t,k[1][1].f);
c[1][1].t=k[1][1].t-dp[1][1];
c[1][1].f=k[1][1].f-dp[1][1];
f[1][1]={0,0};
}
}
if ((dp[n][n]>1)&&(b)){
cout<<"1\n";
for (int i=1;i<y;++i)
cout<<'R';
for (int i=1;i<n;++i)
cout<<'D';
for (int i=1;i<=n-y;++i)
cout<<'R';
return 0;
}
cout<<dp[n][n]<<'\n';
print(n,n);
return 0;
}
看错误信息似乎正确答案是 1,但输出了 2