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, 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的更多相关文章
- USACO 5.4 Character Recognition
Character Recognition This problem requires you to write a program that performs character recogniti ...
- OCR (Optical Character Recognition,光学字符识别)
OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗.亮的模式确定其形状,然后用字符识别方法将形状翻译 ...
- csharp:Optical Character Recognition
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...
- 图片OCR(Optical Character Recognition)
目录 Photo OCR问题描述 滑动窗口(Sliding Windows) 获得大量数据和人工数据(Getting Logs of Data and Artificial Data) 瓶颈分析:需要 ...
- USACO 5.4 Character Recognition(DP)
非常恶心的一题,卡了三个月,没什么动力做了,代码直接抄的别人的... 这题主要思路就是预处理出几个数组,再预处理出几个数组,最后DP,输出一下路径... 写起来挺非常麻烦,代码不贴了,丢人... 把U ...
- OCR(Optical Character Recognition)算法总结
https://zhuanlan.zhihu.com/p/84815144 最全OCR资料汇总,awesome-OCR
- 第 38 章 OCR - Optical Character Recognition
38.1. Tesseract 查找Tesseract安装包 $ apt-cache search Tesseract ocrodjvu - tool to perform OCR on DjVu d ...
- Online handwriting recognition using multi convolution neural networks
w可以考虑从计算机的“机械性.重复性”特征去设计“低效的”算法. https://www.codeproject.com/articles/523074/webcontrols/ Online han ...
- 车牌识别1:License Plate Detection and Recognition in Unconstrained Scenarios阅读笔记
一.WHAT 论文下载地址:License Plate Detection and Recognition in Unconstrained Scenarios [pdf] github 的项目地址: ...
- Tesseract-OCR字符识别简介
OCR(Optical Character Recognition):光学字符识别,是指对图片文件中的文字进行分析识别,获取的过程.Tesseract:开源的OCR识别引擎,初期Tesseract引擎 ...
随机推荐
- (转)鸟哥SHELL入门材料
http://blog.chinaunix.net/space.php?uid=9809038&do=blog&cuid=62903 经典入门材料! 学习 Shell Scripts ...
- 【实验 1-1】编写一个简单的 TCP 服务器和 TCP 客户端程序。程序均为控制台程序窗口。
在新建的 C++源文件中编写如下代码. 1.TCP 服务器端#include<winsock2.h> //包含头文件#include<stdio.h>#include<w ...
- Nicholas C. Zakas(JS圣经:JavaScript高级程序设计作者)如何面试前端工程师
Original Post:Interviewing the front-end engineerNicholas C. Zakas,2010年1月5日翻译完成:2010年1月7日,最后更新:2010 ...
- 我的Android进阶之旅------>Android安全退出应用程序的几种方式
当应用不再使用时,通常需要关闭应用,可以使用以下几种方法关闭android应用: 第一种方法:首先获取当前进程的id,然后杀死该进程. 建议使用这种方式 android.os.Process.kil ...
- php实现文件夹下的文件读取功能
<?php //这里实现 某个文件下的全部图片,并列出来! header("Content-type:text/html;charset=utf8"); $handle= ...
- IE标签a嵌套table标签,链接点击无效
在IE中,使用如下代码将无法触发跳转: <a href="http://xx.xx.com"> <table> <tr> <td>点 ...
- F# 可以把几个函数组合成新函数
C#能做的,F#基本都能做,但F#能做的,C#未必能做. F#中的函数可以把几个函数组合起来使用.下面的例子是把由 function1 和 function2 这两个函数通过运算符“>>” ...
- Directory.GetFiles 方法
Directory.GetFiles 方法 返回指定目录中文件的名称(包括其路径). 命名空间: System.IO程序集: mscorlib(mscorlib.dll 中) Enumerate ...
- C3P0连接池配置方式
c3p0的配置方式分为三种,分别是 1.setters一个个地设置各个配置项 2.类路径下提供一个c3p0.properties文件 3.类路径下提供一个c3p0-config.xml文件 1.set ...
- 设置Chrome和IE搜索栏的默认搜索引擎
由于本人比较喜欢用Google香港作为自己的默认搜索引擎,Chrome里面可以轻松设置. ======================== Chrome ======================= ...