题目大意是字符串识别
一道细节很繁琐的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. Highcharts 基本曲线图

    基本曲线图实例 文件名:highcharts_line_basic.htm <html> <head> <meta charset="UTF-8" / ...

  2. hadoop权威指南 chapter2 MapReduce

    MapReduce MapReduce is a programming model for data processing. The model is simple, yet not too sim ...

  3. muduo源代码分析--我对muduo的理解

    分为几个模块 EventLoop.TcpServer.Acceptor.TcpConnection.Channel等 对于EventLoop来说: 他仅仅关注里面的主驱动力,EventLoop中仅仅关 ...

  4. igmpproxy源码学习——igmpProxyInit()

    igmpproxy源码学习--igmpProxyInit()函数具体解释.igmpproxy初始化 在执行igmpproxy的主程序igmpproxyRun()之前须要对igmpproxy进行一些配置 ...

  5. lua 加密

    项目要求对lua脚本进行加密,查了一下相关的资料 ,得知lua本身可以使用luac将脚本编译为字节码(bytecode)从而实现加密,试了一下,确实可行.下面是使用原生的lua解释器编译字节码:1.新 ...

  6. Facebook登录 AndroidStudio

    简介 主页:https://www.facebook.com/ Android开发者支持:https://developers.facebook.com/docs/android/  应用管理:htt ...

  7. 解决操作过快导致ajax异常的办法

    //控制点击过快ajax异常 var state = true; function test() { if (state) { state = false; var val = accMul((uCo ...

  8. html表格标签与属性

    标记:  标 记  说 明 <Table> 表格标记 <Tr> 行标记 <Td> 单元格标记  <Th> 表头标记 <Table>标记属性: ...

  9. LINUX增加并管理用户

    使用groupadd命令增加新的用户组 使用useradd命令增加新用户: useradd -s /bin/bash -d /home/XXX -g group username 使用passwd修改 ...

  10. 添加序号列(SQL Server)

    SELECT ROW_NUMBER() OVER (ORDER BY 实际缴费金额 ) AS A, --序号 RANK() OVER (ORDER BY 实际缴费金额 ) AS B, --相同跳过从新 ...