CF2B The least round way

Posted qyj060604

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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掉     

以上是关于CF2B The least round way的主要内容,如果未能解决你的问题,请参考以下文章

[CF2B] The least round way - dp

2B The least round way

codeforces 2B The least round way

code force 2B The least round way

Codeforces 2B - The least round way

CodeforcesCF 2 B The least round way(dp)