USACO 5.4 Character Recognition

USACO Character Recognition 解题报告 这道题说是DP,其实就是暴力解。每个点的qian'yi 阅读详情

http://train.usaco.org/usacoprob2?a=nOsVamksRaE&S=charrec


题目大意:一堆奇怪的字符,找到最小误差的匹配

方法:dp(这种按段划分,要求某个值最大或最小,很有dp的特征)

小tips:输入与模板按行匹配时可以记录下结果优化时间(看了USACO的官方解答才知道)


/*
ID: frontie1
TASK: charrec
LANG: C++
*/
#include <iostream>
#include <cstdio>
#include <string>

using namespace std;

const int INFI = 0x3f3f3f3f;

int N;
char dict[27][22][22];
char ori[1205][22];
int dp[1205];
string log[1205];

int compare_same(char model[][22], char obj[][22])
{
    int output = 0;
    for(int i = 0; i < 20; ++i){
        for(int k = 0; k < 20; ++k){
            if(model[i][k] != obj[i][k]) ++output;
        }
    }
    return output;
}

int compare_duplicate(char model[][22], char obj[][22])
{
    int output = INFI, tem = 0;

    for(int i = 0; i <= 20; ++i){
        tem = 0;
        int cur1 = 0, cur2 = 0;
        while(cur1 < 20){
            if(cur2 == i){
                ++cur2;
                continue;
            }
            for(int k = 0; k < 20; ++k){
                if(model[cur1][k] != obj[cur2][k]) ++tem;
            }
            ++cur1; ++cur2;
            if(tem >= output) break;
        }
        output = min(output, tem);
    }

    return output;
}

int compare_miss(char model[][22], char obj[][22])
{
//    for(int i = 0; i < 19; ++i){
//        for(int k = 0; k < 20; ++k){
//            cout << obj[i][k];
//        }
//        cout << endl;
//    }

    int output = INFI, tem = 0;

    for(int i = 0; i < 20; ++i){
        tem = 0;
        int cur1 = 0, cur2 = 0;
        while(cur1 < 20){
            if(cur1 == i){
                ++cur1;
                continue;
            }
            for(int k = 0; k < 20; ++k){
                if(model[cur1][k] != obj[cur2][k]) ++tem;
            }
            if(tem >= output) break;
            ++cur1; ++cur2;
        }
        output = min(output, tem);
//        if(dp[19] < 80 && output < dp[19]){
//            cout << endl;
//            cout << output << endl;
//            int cur1 = 0, cur2 = 0;
//            while(cur1 < 20){
//                if(cur1 == i){
//                    ++cur1;
//                    continue;
//                }
//                for(int k = 0; k < 20; ++k){
//                    if(model[cur1][k] != obj[cur2][k]) cout << 'x';
//                    else cout << model[cur1][k];
//                }
//                cout << endl;
//                ++cur1; ++cur2;
//            }
//        }
    }

    return output;
}

char decode(int i)
{
    if(i == 0) return ' ';
    else return (char)('a' + i - 1);
}

void print(char obj[][22], int lin)
{
    for(int i = 0; i < lin; ++i){
        for(int k = 0; k < 20; ++k){
            cout << obj[i][k];
        }
        cout << endl;
    }

}

int main()
{
    freopen("charrec.out", "w", stdout);

    freopen("font.in", "r", stdin);
    //cin >> N;
    scanf("%d", &N);
    for(int i = 0; i < 27; ++i){
        for(int k = 0; k < 20; ++k){
            //cin >> dict[i][k];
            scanf("%s", &(dict[i][k]));
        }
    }

    freopen("charrec.in", "r", stdin);
    //cin >> N;
    scanf("%d", &N);
    for(int i = 1; i <= N; ++i){
        //cin >> ori[i];
        scanf("%s", &(ori[i]));
    }

    for(int i = 1; i <= N; ++i){
        dp[i] = INFI;
    }
    dp[0] = 0; log[0] = "";

    for(int i = 1; i <= N; ++i){
        if(i >= 19 && dp[i-19] < dp[i]){
            for(int k = 0; k < 27; ++k){
                //if(dp[i-19] > dp[i]) continue;
                int tem = compare_miss(dict[k], &(ori[i-18]));
                if(tem > 120 || dp[i-19] + tem >= dp[i]) continue;
                dp[i] = dp[i-19] + tem;
                log[i] = log[i-19] + decode(k);
            }
        }

        if(i >= 20 && dp[i-20] < dp[i]){
            for(int k = 0; k < 27; ++k){
                //if(dp[i-20] >= dp[i]) continue;
                int tem = compare_same(dict[k], &(ori[i-19]));
                if(tem > 120 || dp[i-20] + tem >= dp[i]) continue;
                dp[i] = dp[i-20] + tem;
                log[i] = log[i-20] + decode(k);
            }
        }

        if(i >= 21 && dp[i-21] < dp[i]){
            for(int k = 0; k < 27; ++k){
                int tem = compare_duplicate(dict[k], &(ori[i-20]));
                if(tem > 120 || dp[i-21] + tem >= dp[i]) continue;
                dp[i] = dp[i-21] + tem;
                log[i] = log[i-21] + decode(k);
            }
        }
    }

//    for(int i = 0; i <= N; ++i){
//        if(dp[i] == INFI) continue;
//        if(i + 19 <= N){
//            for(int k = 0; k < 27; ++k){
//                int tem = compare_miss(dict[k], &(ori[i+1]));
//                if(tem > 120 || dp[i] + tem > dp[i+19]) continue;
//                dp[i+19] = dp[i] + tem;
//                log[i+19] = log[i] + decode(k);
//            }
//        }
//
//        if(i + 20 <= N){
//            for(int k = 0; k < 27; ++k){
//                int tem = compare_same(dict[k], &(ori[i+1]));
//                if(tem > 120 || dp[i] + tem > dp[i+20]) continue;
//                dp[i+20] = dp[i] + tem;
//                log[i+20] = log[i] + decode(k);
//            }
//        }
//
//        if(i + 21 <= N){
//            for(int k = 0; k < 27; ++k){
//                int tem = compare_duplicate(dict[k], &(ori[i+1]));
//                if(tem > 120 || dp[i] + tem > dp[i+21]) continue;
//                dp[i+21] = dp[i] + tem;
//                log[i+21] = log[i] + decode(k);
//            }
//        }
//    }

    cout << log[N] << endl;

    return 0;
}

inferCNVpy分析流程学习 inferCNV的用途大家都已经很清楚了,接下来就走一下流程,试一试Python版的inferCNV。使用的数据集为:GSE188711,既往推文可见:Scanpy分析全流程(含harmonypy整合/细胞周期矫正/双细胞检测及去除)( 阅读详情

相关推荐

Ubuntu下安装Hive3.1.2教程(附MySQL安装方法及安装包)

文章目录前言一、安装Hive1. 下载压缩包并解压2. 安装Hive3. 配置环境变量4. 修改配置文件二、MySQL安装与配置1. 安装MySQL2. 安装MySQL jdbc包3. 为Hive创建MySQL账号三、验证Hive安装及错误处理1. 启动Hadoop2. 启动hive3. 运行Hive实例总结 前言 Hive 的安装需要建立在 Hadoop 的之上(类似于Hbase),关于 Hadoop 的单机安装以及伪分布式安装可以参考作者的另两篇博客: Ubuntu下单机安装Hadoop详细教程(附

程序必须为人类阅读而编写,并且仅仅碰巧可以让机器执行 1万+

usaco5.4

5.4.1 charrec 初看没有抓住重点,以为一行行比较最后统计错误量,枚举删除和复制的行就行了,结果与答案相去甚远。 其实这道题最关键的地方就是 图像中的个别行会发生 删除和复制 的错误,且2者只有一个会发生。程序在执行的时候不知道图像发生了哪种错误,所以要枚举发生错误的方式和发生错误的行。 注意到,刚开始如何划分图像,会对后面的匹配造成巨大影响,比如若把前19行划分为第一张图...

weixin_30394669的博客 172

别让你的URDF模型在Gazebo里‘躺平’:手把手教你配置libgazebo_ros_diff_drive插件让两轮小车动起来

本文详细解析了如何在Gazebo中配置libgazebo_ros_diff_drive插件,使两轮小车模型实现动态仿真。从URDF模型到传动装置,再到差速驱动插件的精细调参,手把手教你解决机器人‘躺平’问题,提升ROS1与Gazebo仿真的实战能力。

weixin_42552716的博客 334

【USACO 5.4.2】Character Recognition

题目大意   一个字符可以表示成一个20*20的01矩阵。它们都在一个叫“fout.in”,共有27个字符,就是空格+小写字母(按字典序从小到大排序)。现在要翻译一个N*20的01矩阵,也就是按“fout.in”匹配每个字符,最后N*20的矩阵变成一个字符串。可惜的是这个N*20的矩阵可能遭到破坏。 每个字符可能遭到如下破坏 1、最多有一行可能被复制了(就接在原来那一行的下面) 2、最多有...

weixin_30869099的博客 201

二、ROS2完成Docker容器和宿主机通信,使用ros2 topic list看到,但是无法echo

如果容器和主机权限不一致,则会导致无法通信(我的代码中,docker容器是root,宿主机是普通用户),虽然可以查询到相关话题,但是订阅后没有消息输出。比如,docker容器创建了一个共享内存,其所有者为docker容器用户root,当宿主机去访问的时候,由于用户不同,没有权限访问,也就无法进行信息传递。该方法只是临时修改共享内存的权限,每次运行完,需要重新运行上述命令,才可以进行通信。在运行的过程中,ROS2使用了共享内存机制,会共享内存。运行之后,宿主机和容器可能用户名不同,这是因为。

qq_43280851的博客 1265

从零打造M328晶体管测试仪:硬件DIY与烧录避坑指南

本文是一份详尽的M328晶体管测试仪DIY指南,涵盖从硬件选型、PCB设计、焊接组装到固件烧录的全过程。重点解析了使用AVR单片机与Arduino IDE环境时,如何正确设置熔丝位以避免“白屏”等常见问题,并提供了使用ISP编程器进行烧录的实操步骤与校准方法,帮助电子爱好者成功打造属于自己的高性价比元件测试工具。

weixin_29243063的博客 475

USACO5.4-Character Recognition

题目大意是字符串识别一道细节很繁琐的DP,要用到很多数组一开始还真看不出是DP,后来参考了别人的代码,然后又按自己的思路重头到尾写了,虽然速度不咋的 Executing... Test 1: TEST OK [0.008 secs, 6504 KB] Test 2: TEST OK [0.008 secs, 6504 KB] Test 3: TEST OK [0.019 secs, ...

weixin_30778805的博客 214

AUTOSAR进阶图解==>AUTOSAR_SWS_CANNetworkManagement

本文介绍了AUTOSAR架构中的CAN网络管理(CanNm)模块,主要内容包括: 模块概述:CanNm是协调CAN网络节点状态转换的基础组件,采用去中心化设计,通过周期性发送网络管理PDU保持网络活跃状态,支持网络唤醒、睡眠和部分网络功能。 架构设计:CanNm位于AUTOSAR中间层,连接上层通信管理器(ComM)和底层CAN接口(CanIf),包含状态管理、PDU处理和定时器管理等子组件。 状态机设计:定义了三种主要模式(总线睡眠、准备睡眠和网络模式)及其转换逻辑,网络模式又包含重复消息、正常操作和准备

一名留德华的,康德的信徒的,专注于汽车电子领域的博客 2040

USACO 5.4.3 Character Recognition

题目大意(转自NOCOW,有缩减): 这个问题需要你写一个程序完成字符识别的任务。 每个完整的字符图案有 20 行,20 位。每个位是“0”或“1” 文件 font.in包括了27个字符图案的信息,以这样的顺序记录: _abcdefghijklmn 其中 _ 表示空格字符。每个完整字符长 20 行。输入文件包含一个或多个可能损坏的字符图案。一个字符图案可能以这些方式被损坏...

weixin_30335353的博客 217

北斗导航 | ChatGPT之RTK、RTD、ARAIM算法原理及程序代码(ChatGPT看你怎么回答,附部分代码)

ChatGPT之RTK、RTD、ARAIM算法原理及程序代码

尘世冰封的专栏 3678

06 - 深度学习处理器原理

深度学习处理器的重要性在于它们可以加速深度学习任务的执行,从而推动了人工智能的发展。传统的通用处理器虽然可以执行深度学习任务,但它们不够高效,需要消耗大量的能量和时间。深度学习处理器通过硬件加速和特定设计来优化深度学习任务的执行,从而可以提高执行效率、降低能耗和加速训练和推断过程。 深度学习处理器的发展也推动了深度学习算法的创新,因为算法的发展需要硬件的支持和驱动。同时,深度学习处理器的出现也促进了更广泛的应用场景,包括自动驾驶、人脸识别、语音识别、图像识别等领域。因此,深度学习处理器的重要性不仅在于加速

m0_51339444的博客 752

USACO Section 5.4 Character Recognition

题意: 图像识别

House 1668

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

usaco5.4.2 Character Recognition

一 原题 Character Recognition This problem requires you to write a program that performs character recognition. Each ideal character image has 20 lines of 20 digits. Each digit is a `0' or a `1'.

max_kibble的博客 344

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

usaco 5.4 Character Recognition(统计DP)

Character Recognition This problem requires you to write a program that performs character recognition. Each ideal character image has 20 lines of 20 digits. Each digit is a `0' or a `1'. See Figu

志当存高远 1668

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Usaco Training Section 5.4 Character Recognition

看起来有点吓人,其实基本是个模拟。 看了半天才搞清楚两个输入文件是干啥的。font.in是27个字符(空格,a,b,c,...,z)所对应的图案,共541行。charrec.in是一串字符所对应的图案。图案有损坏(具体看翻译)。要找出使损坏数字最少的序列。 统计时用到一些简单的dp,其他就是暴力。算是挺简单的一题。 #include&lt;bits/stdc++.h&gt; #defi...

Monster的博客 405

C++——【USACO 5.4.2】——Character Recognition

Character Recognition This problem requires you to write a program that performs character recognition. Each ideal character image has 20 lines of 20 digits. Each digit is a `0' or a `1'. See Fi

McDonnell_Douglas的博客 707

USACO 5.4 Character Recognition(DP)

非常恶心的一题,卡了三个月,没什么动力做了,代码直接抄的别人的。。。 这题主要思路就是预处理出几个数组,再预处理出几个数组,最后DP,输出一下路径。。。 写起来挺非常麻烦,代码不贴了,丢人。。。 把USACO,赶紧刷完把。 转载于:https://www.cnblogs.com/naix-x/p/3265930.html...

weixin_30483013的博客 131

USACO 5.4 Character Recognition (最小点割集)

2015-04-0323:36:48 思路:这题求的是最小点割集,但我们可以将其转化为求最小边割集的问题。将每个点拆点,建边,容量为1。然后根据输入也可以建边。   这样我们不妨以c1的输入点和c2的输出点为起点和终点,跑一遍最大流,求出最小点割集的数量。   因为要求字典序,可以枚举删除1~N每个点,如果删除完后求一遍最大流流量减少了1,那么取这个点为答案,并且永久删除(为了保...

dingdi3021的博客 201

usaco Character Recognition

/* ID :jinbo wu TASK:charrec LANG:C++ */ #include using namespace std; string f1[550],f2[1250]; int mi[1250][4],n1,n2; int mat[1250][550]; string ss[1250]; char ans[1250][4]; int f[1250]; string str=

silence401的博客 498

usaco5.4.3 Telecowmunication

一 原题 Telecowmunication Farmer John's cows like to keep in touch via email so they have created a network of cowputers so that they can intercowmunicate. These machines route email so that if the

max_kibble的博客 901

usaco training 4.3.3 Street Race 题解

Street Race题解 IOI'95 Figure 1 gives an example of a course for a street race. You see some points, labeled from 0 to N (here, N=9), and some arrows connecting them. Point 0 is the start of the rac

阿蒋的专栏 2027

【CJOJ1793】【USACO 4.3.2】素数方阵

题面Description在下面的方格中,每行,每列,以及两条对角线上的数字可以看作是五位的素数。方格中的行按照从左到右的顺序组成一个素数,而列按照从上到下的顺序。两条对角线也是按照从左到右的顺序来组成。这些素数各个数位上的和必须相等。 左上角的数字是预先定好的。 一个素数可能在方阵中重复多次。 如果不只有一个解,将它们全部输出(按照这25个数字组成的25位数的大小排序)。 一个五位的素数开

小蒟蒻yyb的博客 4106

USACO 6.3.1 Fence Rails 01多背包问题(BS+IDDFS)

http://train.usaco.org/usacoprob2?a=NaWWtjt80VA&amp;S=fence8题目大意:有N(1-50)块原木,要切成R(1-1023)块长度(1-128)可重复的木板,并不一定所有的木板都能被切出来,求能够交货的最大木板数量错误想法:我一开始正着想觉得有种网络流的感觉,把每个原木看作一个有限容量的节点,和每个木板结点以无限容量的管道连接,木板结点在和汇点...

Frontier_Setter的博客 730

USACO 6.1.1 Postal Vans 特例dp

http://train.usaco.org/usacoprob2?a=iHzQON4VeJX&amp;S=vans题目大意:由4条横线,N条纵线划划分的网络,要求一条路线经过每个网点一次且仅一次,求共有多少条这样的路径想法一:枚举,不可能,其实到第五章之后的题目好像都不太能枚举了想法二:相当于先有一个最外层的大矩形轮廓,然后逐步“下凹”,只要下凹的那一格在当前外表面轮廓组成中只有一条边就不会使最...

Frontier_Setter的博客 548
下一篇: USACO 5.4 TeleCowmuinication 最小割点
Frontier_Setter
博客等级 码龄10年 2粉丝 123原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值