wa 31求助!玄关
查看原帖
wa 31求助!玄关
815710
double_wings楼主2023/10/26 21:24
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
using ull=unsigned long long;
//#define mid ((l+r)>>1)
//#define len (r-l+1)
//#define ls p<<1
//#define rs p<<1|1
//#define int long long
constexpr int inf=1e9+7;
constexpr int mod=998244353;
//constexpr ll inf=1e18+7;
constexpr int N=1003;
int n;
int a[N][N][2];
int dp[N][N][2];

void get(int x,int y,int k,int biao)
{
    if(x==1&&y==1);
    else if(x==1&&y!=1)get(x,y-1,k,0);
    else if(x!=1&&y==1)get(x-1,y,k,1);
    else 
    {
        if(dp[x][y][k]==dp[x-1][y][k]+a[x][y][k]) get(x-1,y,k,1);
        else get(x,y-1,k,0);
    }
    if(biao==inf)return ;
    cout<<(biao?'D':'R');
}

// char buf[1<<21],*p1,*p2;
// #define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
ll read(){ll x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+ch-'0',ch=getchar();return x*f;}
void wt(long long x,char ch=0){if(x<0) putchar('-'),wt(-x);else{if(x>=10) wt(x/10);putchar(x%10+'0');}if(ch) putchar(ch);return;}
signed main(){
    //freopen("in.in","r",stdin);
    //freopen("ot.out","w",stdout);
    cin.tie(0);
    cout.tie(0);
    n=read();
    int biao=0;
    int x,y;
    for(int i=1;i<=n;++i)
    {
        for(int j=1;j<=n;++j)
        {
            int w=read();
            if(!w)
            {
                biao=1;
                a[i][j][0]++;
                a[i][j][1]++;
                x=i,y=j;
                continue;
            }
            while(w%2==0) a[i][j][0]++,w/=2;
            while(w%5==0) a[i][j][1]++,w/=5;
        }
    }
    memset(dp,0x3f,sizeof(dp));
    dp[1][1][1]=0;
    dp[1][1][0]=0;
    for(int k=0;k<=1;++k)
    {
        for(int i=1;i<=n;++i)
        {
            for(int j=1;j<=n;++j)
            {
                if(i!=1) dp[i][j][k]=min(dp[i][j][k],dp[i-1][j][k]);
                if(j!=1) dp[i][j][k]=min(dp[i][j][k],dp[i][j-1][k]);
                dp[i][j][k]+=a[i][j][k];
            }
        }
    }
    int ans=min(dp[n][n][0],dp[n][n][1]);
    if(ans>1&&biao)
    {
        //有 0 并且不算 0 的时候比 1 大
        wt(1,'\n');
        for(int i=1;i<x;++i) cout<<'D';
        for(int i=1;i<y;++i) cout<<'R';
        for(int i=x;i<=n;++i) cout<<'D';
        for(int i=y;i<=n;++i) cout<<'R';
        return 0;
    }
    wt(ans,'\n');
    if(dp[n][n][0]<dp[n][n][1]) get(n,n,0,inf);
    else get(n,n,1,inf);
    fclose(stdin);
    fclose(stdout);
    return 0;
}
2023/10/26 21:24
加载中...