CF2B The least round way

CF2B The least round way     

message1:    

脚造的垃圾hack数据:    

3

0 1 1 

1 1 1

1 1 1

ans:   

1

DDRR

数据2:    

3

0 1 1

1 1 0

1 1 1

ans:    

1

DDRR      

dp    

0由2×5组成     

预处理每个位置2因子、5因子个数     

f[i][j][k]表示dp到(i,j),k因子至少有几个     

输出路径只要倒着dfs一遍即可    

代码:     

#include<bits/stdc++.h>
using namespace std;
int n;
int s[1005][1005][2]={0};
int g[1005][1005][2]={0};//-1:no 0:up 1:left
bool flag=0;
int xx,yy;
void get(int i,int j,int x){
    int cnt1=0,cnt2=0;
    while(x%2==0) x/=2,cnt1++;
    while(x%5==0) x/=5,cnt2++;
    s[i][j][0]=cnt1,s[i][j][1]=cnt2;
}
void print(int x,int y,int k,int F){
    if(x==1&&y==1) ;
    else if(x==1) print(x,y-1,k,0);
    else if(y==1) print(x-1,y,k,1);
    else{
        if(g[x][y][k]==g[x][y-1][k]+s[x][y][k]) print(x,y-1,k,0);
        else print(x-1,y,k,1);
    }
    if(F==0) printf("R");
    else if(F==1) printf("D"); 
}
int main(){
    //freopen("a.in","r",stdin);
    //freopen("a.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            int x;
            scanf("%d",&x);
            if(x==0){
                flag=1;
                s[i][j][0]++,s[i][j][1]++;
                xx=i,yy=j;
            }
            else{
                get(i,j,x);
            }
        }
    }
    memset(g,127,sizeof(g));
    g[1][1][0]=s[1][1][0];
    g[1][1][1]=s[1][1][1];
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(i==1&&j==1) continue;
            int a,b;
            a=g[i-1][j][0],b=g[i][j-1][0];
            if(a<b){
                g[i][j][0]=a+s[i][j][0];
            }
            else{
                g[i][j][0]=b+s[i][j][0];
            }
            a=g[i-1][j][1],b=g[i][j-1][1];
            if(a<b){
                g[i][j][1]=a+s[i][j][1];
            }
            else{
                g[i][j][1]=b+s[i][j][1];
            }
        }
    }
    if(min(g[n][n][0],g[n][n][1])>1&&flag){
        printf("1\n");
        for(int i=1;i<xx;i++) printf("D");
        for(int i=1;i<yy;i++) printf("R");
        for(int i=xx+1;i<=n;i++) printf("D");
        for(int i=yy+1;i<=n;i++) printf("R");
        return 0;
    }
    printf("%d\n",min(g[n][n][0],g[n][n][1]));
    if(g[n][n][0]<g[n][n][1]) print(n,n,0,233);
    else print(n,n,1,233);
    return 0;
}

但是这份代码还是会被前面的hack数据给hack掉     

posted @ 2019-08-28 22:07  QYJ060604  阅读(112)  评论(0编辑  收藏  举报