CF2B The least round way

本文针对CF2B The Least Round Way问题提供了解决方案,通过动态规划(DP)来寻找最短路径,使得路径上的数字乘积包含尽可能少的2和5作为质因数。代码实现中使用了三维数组进行状态转移,并提供了逆向深度优先搜索(DFS)以输出具体路径。

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掉     

转载于:https://www.cnblogs.com/QYJ060604/p/11426844.html

下载前可以先看下教程 https://pan.quark.cn/s/16a53f4bd595 小天才电话手表刷机教程 — 基础篇 我们将为您简单的介绍小天才电话手表新机型的简单刷机以及玩法,如adb工具的使用,magisk的刷入等等。 我们会确保您看完此教程后能够对Android系统有一个最基本的认识,以及能够成功通过magisk root您的手表,并安装您需要的第三方软件。 ADB Android Debug Bridge,简称,在android developer的adb文档中是这么描述它的: 是一种多功能命令行工具,可让您与设备进行通信。 该命令有助于各种设备操作,例如安装和调试应用程序。 提供对 Unix shell 的访问,您可以使用它在设备上运行各种命令。 它是一个客户端-服务器程序。 这听起来有些难以理解,因为您也没有必要去理解它,如果您对本文中的任何关键名词产生疑惑或兴趣,您都可以在搜索引擎中去搜索它,当然,我们会对其进行简单的解释:是一款在命令行中运行的,用于对Android设备进行调试的工具,并拥有比一般用户以及程序更高的权限,所以,我们可以使用它对Android设备进行最基本的调试操作。 而在小天才电话手表上启用它,您只需要这么做: - 打开拨号盘; - 输入; - 点按打开adb调试选项。 其次是电脑上的Android SDK Platform-Tools的安装,此工具是 Android SDK 的组件。 它包括与 Android 平台交互的工具,主要由和构成,如果您接触过Android开发,必然会使用到它,因为它包含在Android Studio等IDE中,当然,您可以独立下载,在下方选择对应的版本即可: - Download SDK Platform...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值