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.

  1 #include <stack>
  2 #include <iostream>
  3 #include <stdio.h>
  4 #define R19 0
  5 #define R20 1
  6 #define R21 2
  7 #define INF 1000000000
  8 using namespace std;
  9
 10 char ch[28][22][22];
 11 char mat[1210][22];
 12 int dif[28][22][1210];
 13 int cost[1210][4]; // cost[i][j]表示从mat的第i行开始匹配j行得到的最小差距
 14 int optimalCh[1210][4]; // optimalCh[i][j]表示从mat的第i行开始匹配j行最优的匹配字符
 15 int d[1210]={0}; // d[i]表示匹配到第i行所得到的最小差距
 16 int step[1210]; // step[i]表示第i行开始的最优匹配的字符行数
 17 // 得到行数中不同的个数
 18 /*
 19 num为第几个字符
 20 l1为num字符的行数
 21 l2为mat的行数
 22 */
 23 int getDif(int num,int l1,int l2)
 24 {
 25     int sum=0;
 26     for(int i=0;i<20;i++)
 27     {
 28         if(ch[num][l1][i]!=mat[l2][i])
 29             sum++;
 30     }
 31     return sum;
 32 }
 33
 34 // num为字符,l1为mat开始匹配的行数,del为删除了哪一行
 35 int getCost(int num,int l1,int del)
 36 {
 37     int sum=0;
 38     for(int i=0,p=0;p<19;i++,p++)
 39     {
 40         if(i==del)
 41             i++;
 42         sum+=dif[num][i][l1+p];
 43     }
 44     return sum;
 45 }
 46
 47 int getCost2(int num,int l1,int del)
 48 {
 49     int sum=0;
 50     for(int i=0,p=0;i<20;i++,p++)
 51     {
 52         if(p==del)
 53             p++;
 54         sum+=dif[num][i][p+l1];
 55     }
 56     return sum;
 57 }
 58
 59
 60 int main()
 61 {
 62     freopen("font.in","r",stdin);
 63     int n; // 行数
 64     cin>>n;
 65     for(int i=0;i<n/20;i++)
 66     {
 67         for(int j=0;j<20;j++)
 68         {
 69             scanf("%s",ch[i][j]);
 70
 71         }
 72     }
 73
 74     freopen("charrec.in","r",stdin);
 75     freopen("charrec.out","w",stdout);
 76
 77     cin>>n;
 78
 79     for(int i=0;i<n;i++)
 80         scanf("%s",mat[i]);
 81
 82     // 初始化dif数组
 83     for(int i=0;i<27;i++)
 84         for(int j=0;j<20;j++)
 85         {
 86             for(int k=0;k<n;k++)
 87             {
 88                 dif[i][j][k]=getDif(i,j,k);
 89             }
 90         }
 91
 92     // 初始化cost
 93     for(int i=0;i<n;i++) // 从第i行开始匹配
 94     {
 95         cost[i][R19]=cost[i][R20]=cost[i][R21]=INF;
 96         for(int j=0;j<27;j++) // 第j个字符
 97         {
 98             if(i+19<n+1)
 99             {
100                 for(int k=0;k<20;k++) // 删掉行数
101                 {
102                     if(cost[i][R19]>getCost(j,i,k))
103                     {
104                         cost[i][R19]=getCost(j,i,k);
105                         optimalCh[i][R19]=j;
106                     }
107                 }
108             }
109             if(i+20<n+1)
110             {
111                 if(cost[i][R20]>getCost(j,i,-1))
112                 {
113                     cost[i][R20]=getCost(j,i,-1);
114                     optimalCh[i][R20]=j;
115                 }
116             }
117             if(i+21<n+1)
118             {
119                 for(int k=0;k<21;k++) // 多出的行数
120                 {
121                     if(cost[i][R21]>getCost2(j,i,k))
122                     {
123                         cost[i][R21]=getCost2(j,i,k);
124                         optimalCh[i][R21]=j;
125                     }
126                 }
127             }
128         }
129     }
130
131     fill_n(d,n+5,INF);
132     // 初始值
133     d[18]=cost[0][R19];step[18]=19;
134     d[19]=cost[0][R20];step[19]=20;
135     d[20]=cost[0][R21];step[20]=21;
136     // DP
137     for(int i=21;i<n;i++) // 匹配的最后一行为i
138     {
139         if(d[i-19]+cost[i-18][R19]<d[i])
140         {
141             d[i]=d[i-19]+cost[i-18][R19];
142             step[i]=19;
143         }
144         if(d[i-20]+cost[i-19][R20]<d[i])
145         {
146             d[i]=d[i-20]+cost[i-19][R20];
147             step[i]=20;
148         }
149         if(d[i-21]+cost[i-20][R21]<d[i])
150         {
151             d[i]=d[i-21]+cost[i-20][R21];
152             step[i]=21;
153         }
154     }
155
156     stack<int> S;
157
158     for(int p=n-1;p!=-1;p=p-step[p])
159     {
160         S.push(optimalCh[p-step[p]+1][step[p]-19]);
161     }
162
163     while(!S.empty())
164     {
165         int tmp=S.top();
166         S.pop();
167         printf("%c",tmp==0?‘ ‘:tmp-1+‘a‘);
168     }
169     cout<<endl;
170     return 0;
171 }
时间: 2024-08-30 13:05:12

USACO5.4-Character Recognition的相关文章

csharp:Optical Character Recognition

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86

【USACO 5.4.2】Character Recognition

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

96.7% recognition rate for handwritten Chinese characters using AI that mimics the human brain

96.7% recognition rate for handwritten Chinese characters using AI that mimics the human brain Fujitsu today announced the development of the world's first handwriting recognition technology by utilizing AI technology modeled on human brain processes

Handbook of Document Image Processing and Recognition文档图像处理与识别手册

编辑:David Doermann(马里兰大学)Karl Tombre(洛林大学) 前言 In the beginning, there was only OCR. After some false starts, OCR became a competitive commercial enterprise in the 1950’s. A decade later there were more than 50 manufacturers in the US alone. With the a

Machine Learning第十一周笔记:photo OCR

博客已经迁移至Marcovaldo's blog (http://marcovaldong.github.io/) 刚刚完毕了Cousera上Machine Learning的最后一周课程.这周介绍了machine learning的一个应用:photo OCR(optimal character recognition,光学字符识别),以下将笔记整理在以下. Photo OCR Problem Description and Pipeline 最后几小节介绍机器学习的一个应用--photo O

Tesseract-OCR 字符识别---样本训练

转自:http://blog.csdn.net/feihu521a/article/details/8433077 Tesseract是一个开源的OCR(Optical Character Recognition,光学字符识别)引擎,可以识别多种格式的图像文件并将其转换成文本,目前已支持60多种语言(包括中文). Tesseract最初由HP公司开发,后来由Google维护,目前发布在Googel Project上.地址为http://code.google.com/p/tesseract-oc

近邻搜索算法

最近邻搜索(Nearest Neighbor Search) Name of the problem: nearest neighbors, k nearest neighbors (kNN, k-NN), nearset neighbor search, proximity search, similarity search, approximate nearest neighbors (ANN), range queries, maximal intersection queries, po

关于PGM在OCR方面的应用

本文仅仅是一个简单的PGM在OCR方面的应用的实践. 仅此记录下来实现的思路. OCR(Optical Character Recognition)即是将手写的文字用计算机自动的识别出来,然后输送到计算机里. OCR目前仍然没有完全成功的产品.但是不论OCR再进行优化,他的基本思路都是相同的. 在此,我仅仅使用到了两个比较通用的OCR方面的优化方法进行说明. 首先最基本的,就是直接通过采集到的手写体问题图片进行识别,我们假定前后的letters之间没有任何的关联. 使用softmax,DL或者任

C++开源代码项目汇总

Google的C++开源代码项目 v8  -  V8 JavaScript EngineV8 是 Google 的开源 JavaScript 引擎.V8 采用 C++ 编写,可在谷歌浏览器(来自 Google 的开源浏览器)中使用.V8 根据 ECMA-262 第三版中的说明使用 ECMAScript,并在使用 IA-32 或 ARM 处理器的 Windows XP 和 Vista.Mac OS X 10.5 (Leopard) 以及 Linux 系统中运行.V8 可以独立运行,也可以嵌入任何

OCR 基本知识

OCR,optical character recognition 的简称,也就是光学识别系统,属于图形识别的一个分支,OCR是针对印刷体字符,采用光学的方式将文档资料转换成原始资料黑白点阵的图像文件,通过识别软件将图像中的文字识别成中文和英文内码,然后转换成文本格式.这样计算机就可以通过OCR识别系统,可以清楚自己看到了什么,读到了什么,尤其是文字资料. (1)处理过程: 影像输入->影像前处理->文字特征的提取->对比识别->最后通过人工矫正将误判的文字更正,最后将结果输出.