选择计算2^k*5^m中k小的和m小的
如果有0,则答案是1和0中小的那个
#include <iostream>
#include <cstring>
#include <cmath>
#include <string>
using namespace std;
int map[1100][1100],b[1100][1100],d[1100][1100];
int n,p,q;
int best=1111111111;
string res;
void go(int x,int y)
{
if( x && d[x][y]==b[x][y]+d[x-1][y])
{
go(x-1,y);
res.push_back('D');
}
else if(y)
{
go(x,y-1);
res.push_back('R');
}
}
void solve( int c )
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
p=0;
while( map[i][j]&&map[i][j]%c==0)
{
p++;
map[i][j]/=c;
}
b[i][j]=p;
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
if( i ) d[i][j]=d[i-1][j]+b[i][j];
else if(j) d[i][j]=d[i][j-1]+b[i][j];
else d[i][j]=b[i][j];
if(i) d[i][j]=min(d[i][j],d[i-1][j]+b[i][j]);
if(j) d[i][j]=min(d[i][j],d[i][j-1]+b[i][j]);
}
if(best>d[n-1][n-1])
{
res="";
best=d[n-1][n-1];
go(n-1,n-1);
}
}
int main()
{
memset(map,0,sizeof(map));
cin >> n;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cin >> map[i][j];
solve(2);solve(5);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++) if(map[i][j]==0&&best>1)
{
best=1;
res="";
for(int k=0;k<i;k++) res.push_back('D');
for(int k=0;k<j;k++) res.push_back('R');
for(int k=i;k<n-1;k++) res.push_back('D');
for(int k=j;k<n-1;k++) res.push_back('R');
}
cout << best << endl;
cout << res << endl;
return 0;
}