题目大意是字符串识别
一道细节很繁琐的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, 6504 KB]
Test 4: TEST OK [0.035 secs, 6504 KB]
Test 5: TEST OK [0.084 secs, 6504 KB]
Test 6: TEST OK [0.116 secs, 6504 KB]
Test 7: TEST OK [0.167 secs, 6504 KB]
Test 8: TEST OK [0.192 secs, 6504 KB]
Test 9: TEST OK [0.178 secs, 6504 KB]

All tests OK.
YOUR PROGRAM ('charrec') WORKED FIRST TIME! That's fantastic
-- and a rare thing. Please accept these special automated
congratulations.

 #include <stack>
#include <iostream>
#include <stdio.h>
#define R19 0
#define R20 1
#define R21 2
#define INF 1000000000
using namespace std; char ch[][][];
char mat[][];
int dif[][][];
int cost[][]; // cost[i][j]表示从mat的第i行开始匹配j行得到的最小差距
int optimalCh[][]; // optimalCh[i][j]表示从mat的第i行开始匹配j行最优的匹配字符
int d[]={}; // d[i]表示匹配到第i行所得到的最小差距
int step[]; // step[i]表示第i行开始的最优匹配的字符行数
// 得到行数中不同的个数
/*
num为第几个字符
l1为num字符的行数
l2为mat的行数
*/
int getDif(int num,int l1,int l2)
{
int sum=;
for(int i=;i<;i++)
{
if(ch[num][l1][i]!=mat[l2][i])
sum++;
}
return sum;
} // num为字符,l1为mat开始匹配的行数,del为删除了哪一行
int getCost(int num,int l1,int del)
{
int sum=;
for(int i=,p=;p<;i++,p++)
{
if(i==del)
i++;
sum+=dif[num][i][l1+p];
}
return sum;
} int getCost2(int num,int l1,int del)
{
int sum=;
for(int i=,p=;i<;i++,p++)
{
if(p==del)
p++;
sum+=dif[num][i][p+l1];
}
return sum;
} int main()
{
freopen("font.in","r",stdin);
int n; // 行数
cin>>n;
for(int i=;i<n/;i++)
{
for(int j=;j<;j++)
{
scanf("%s",ch[i][j]); }
} freopen("charrec.in","r",stdin);
freopen("charrec.out","w",stdout); cin>>n; for(int i=;i<n;i++)
scanf("%s",mat[i]); // 初始化dif数组
for(int i=;i<;i++)
for(int j=;j<;j++)
{
for(int k=;k<n;k++)
{
dif[i][j][k]=getDif(i,j,k);
}
} // 初始化cost
for(int i=;i<n;i++) // 从第i行开始匹配
{
cost[i][R19]=cost[i][R20]=cost[i][R21]=INF;
for(int j=;j<;j++) // 第j个字符
{
if(i+<n+)
{
for(int k=;k<;k++) // 删掉行数
{
if(cost[i][R19]>getCost(j,i,k))
{
cost[i][R19]=getCost(j,i,k);
optimalCh[i][R19]=j;
}
}
}
if(i+<n+)
{
if(cost[i][R20]>getCost(j,i,-))
{
cost[i][R20]=getCost(j,i,-);
optimalCh[i][R20]=j;
}
}
if(i+<n+)
{
for(int k=;k<;k++) // 多出的行数
{
if(cost[i][R21]>getCost2(j,i,k))
{
cost[i][R21]=getCost2(j,i,k);
optimalCh[i][R21]=j;
}
}
}
}
} fill_n(d,n+,INF);
// 初始值
d[]=cost[][R19];step[]=;
d[]=cost[][R20];step[]=;
d[]=cost[][R21];step[]=;
// DP
for(int i=;i<n;i++) // 匹配的最后一行为i
{
if(d[i-]+cost[i-][R19]<d[i])
{
d[i]=d[i-]+cost[i-][R19];
step[i]=;
}
if(d[i-]+cost[i-][R20]<d[i])
{
d[i]=d[i-]+cost[i-][R20];
step[i]=;
}
if(d[i-]+cost[i-][R21]<d[i])
{
d[i]=d[i-]+cost[i-][R21];
step[i]=;
}
} stack<int> S; for(int p=n-;p!=-;p=p-step[p])
{
S.push(optimalCh[p-step[p]+][step[p]-]);
} while(!S.empty())
{
int tmp=S.top();
S.pop();
printf("%c",tmp==?' ':tmp-+'a');
}
cout<<endl;
return ;
}

USACO5.4-Character Recognition的更多相关文章

  1. USACO 5.4 Character Recognition

    Character Recognition This problem requires you to write a program that performs character recogniti ...

  2. OCR (Optical Character Recognition,光学字符识别)

    OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗.亮的模式确定其形状,然后用字符识别方法将形状翻译 ...

  3. csharp:Optical Character Recognition

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...

  4. 图片OCR(Optical Character Recognition)

    目录 Photo OCR问题描述 滑动窗口(Sliding Windows) 获得大量数据和人工数据(Getting Logs of Data and Artificial Data) 瓶颈分析:需要 ...

  5. USACO 5.4 Character Recognition(DP)

    非常恶心的一题,卡了三个月,没什么动力做了,代码直接抄的别人的... 这题主要思路就是预处理出几个数组,再预处理出几个数组,最后DP,输出一下路径... 写起来挺非常麻烦,代码不贴了,丢人... 把U ...

  6. OCR(Optical Character Recognition)算法总结

    https://zhuanlan.zhihu.com/p/84815144 最全OCR资料汇总,awesome-OCR

  7. 第 38 章 OCR - Optical Character Recognition

    38.1. Tesseract 查找Tesseract安装包 $ apt-cache search Tesseract ocrodjvu - tool to perform OCR on DjVu d ...

  8. Online handwriting recognition using multi convolution neural networks

    w可以考虑从计算机的“机械性.重复性”特征去设计“低效的”算法. https://www.codeproject.com/articles/523074/webcontrols/ Online han ...

  9. 车牌识别1:License Plate Detection and Recognition in Unconstrained Scenarios阅读笔记

    一.WHAT 论文下载地址:License Plate Detection and Recognition in Unconstrained Scenarios [pdf] github 的项目地址: ...

  10. Tesseract-OCR字符识别简介

    OCR(Optical Character Recognition):光学字符识别,是指对图片文件中的文字进行分析识别,获取的过程.Tesseract:开源的OCR识别引擎,初期Tesseract引擎 ...

随机推荐

  1. Linux内核数据包的发送传输

    本文主要讲解了Linux内核数据包的传输流程,使用的内核的版本是2.6.32.27 为了方便理解,本文采用整体流程图加伪代码的方式从内核高层面上梳理了二层数据包发送传输的流程,希望可以对大家有所帮助. ...

  2. cnBlogs_代码着色

    一个程序员当然希望写出来的代码不仅质量上好,而且看上去也很好.以前在网络上看见别人写的代码,着色以及背景都好极了,很是羡慕,但就是不知道如何设置 --------------------------- ...

  3. [转载]SQL Server查找包含某关键字的存储过程3种方法

    存储过程都写在一个指定的表中了,我们只要使用like查询就可以实现查询当前这台SQL Server中所有存储过程中包括了指定关键字的存储过程并显示出来,下面一起来看看我总结了几条命令. 例子1 代码如 ...

  4. 几款命令行工具(CMD)增强软件

    如果经常要与 命令行工具(CMD)打交道,推荐几款工具来增强与替代 Windows 默认的 CMD. 1.PowerCMD 优点:老牌软件,功能强大,支持自定义配色方案,目前最新版本为 2.2: 缺点 ...

  5. Mina入门实例

    继续上一篇,这篇主要讲通过mina往B端发送消息.并接受消息,mina是一个网络通信框架,封装了javaNIO.简单易用.网上有非常多关于他的介绍,在此不赘述了. 如上篇所介绍,完毕功能,须要五个类: ...

  6. 使用memcached加速web应用实例

    在实际应用中,一般会把数据库查询的结果保存到memcached中,下次訪问数据库时直接从memcached中获取.而不再进行数据库操作,这样非常大的程度上减轻了数据库的负担. [演示样例]: < ...

  7. UVA 10651 Pebble Solitaire(bfs + 哈希判重(记忆化搜索?))

    Problem A Pebble Solitaire Input: standard input Output: standard output Time Limit: 1 second Pebble ...

  8. js中setTimeout/setInterval定时器用法示例

    js中setTimeout(定时执行一次)和setInterval(间隔循环执行)用法介绍. setTimeout:在指定的毫秒数后调用指定的代码段或函数:setTimeout示例代码 functio ...

  9. Asp.net +Jquery-uploadify多文件上传

    页面代码如下: <link href="JS/jquery.uploadify/uploadify.css" rel="stylesheet" type= ...

  10. Sybase datetime 时间转换格式 convert(varchar(10),字段名,转换格式)

    convert(varchar(10),字段名,转换格式)sybase下convert函数第三个参数(时间格式)比如:1.select user_id,convert(varchar(10),dayt ...