USACO 5.4.2 以后在理解

   这道题的意思是到现在理解的不太透彻, 以后需要在看,  先把代码贴上吧

/*
    ID: m1500293
    LANG: C++
    PROG: charrec
*/
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;
const char letter[30] = " abcdefghijklmnopqrstuvwxyz";
int ans[1201];
int font[28][21][21];
int data[1201][21], dif[28][21][1201];    //dif表示第i个字符的第j行和输入的第k行的差距
int cost[1201][4];  //表示从第i行开始
int from[1201][4];
int f[1201], g[1201];
int main()
{
    freopen("font.in", "r", stdin);
    int n;
    scanf("%d", &n);  getchar();
    for(int i=1; i<=27; i++)
        for(int j=1; j<=20; j++)
        {
            for(int k=1; k<=20; k++)
                font[i][j][k] = getchar();
            getchar();
        }
    freopen("charrec.in", "r", stdin);
    freopen("charrec.out", "w", stdout);
    scanf("%d", &n); getchar();
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=20; j++)
            data[i][j] = getchar();
        getchar();
    }
    //预处理dif数组
    for(int i=1; i<=27; i++)
        for(int j=1; j<=20; j++)
        for(int k=1; k<=n; k++)
        for(int p=1; p<=20; p++)
        if(data[k][p] != font[i][j][p])
        dif[i][j][k]++;
    //预处理cost数组
    for(int i=1; i<=n; i++)
    {
        cost[i][1] = cost[i][2] = cost[i][3]=0x3fffffff;
        if(i+18 <= n)    //缺失一行
        for(int j=1; j<=27; j++)
        {
            int total=0;
            for(int k=2; k<=20; k++)  total += dif[j][k][i+k-2];
            if(total < cost[i][1]) cost[i][1]=total, from[i][1]=j;
            for(int k=2; k<=20; k++)
            {
                total += dif[j][k-1][i+k-2]; total -= dif[j][k][i+k-2];
                if(total<cost[i][1]) cost[i][1]=total, from[i][1]=j;
            }
        }
        if(i+19 <= n)   //正好20行
        for(int j=1; j<=27; j++)
        {
            int total = 0;
            for(int k=1; k<=20; k++) total += dif[j][k][i+k-1];
            if(total < cost[i][2]) cost[i][2]=total, from[i][2]=j;
        }
        if(i+20<=n)    //多一行
        for(int j=1; j<=27; j++)
        {
            int total = dif[j][1][i];
            for(int k=2; k<=20; k++) total += dif[j][k][i+k];
            if(total<cost[i][3]) cost[i][3]=total, from[i][3]=j;
            for(int k=2; k<=20; k++)    //多第k行
            {
                total += dif[j][k][i+k-1]; total -= dif[j][k][i+k];
                if(total < cost[i][3]) cost[i][3] = total, from[i][3] = j;
            }
        }
    }
    int inf = 0x3fffffff;
    f[0] = 0;
    for(int i=1; i<=n; i++) f[i] = inf;
    for(int i=19; i<=n; i++)
    {
        if(i>=19 && f[i-19]<inf && f[i-19]+cost[i-18][1]<f[i])
            f[i]=f[i-19]+cost[i-18][1], g[i]=19;
        if(i>=20 && f[i-20]<inf && f[i-20]+cost[i-19][2]<f[i])
            f[i]=f[i-20]+cost[i-19][2], g[i]=20;
        if(i>=21 && f[i-21]<inf && f[i-21]+cost[i-20][3]<f[i])
            f[i]=f[i-21]+cost[i-20][3], g[i]=21;
    }
    int total = 0;
    for(int i=n; i; i-=g[i])
        ans[++total] = from[i-g[i]+1][g[i]-18];
    for(int i=total; i; i--) printf("%c", letter[ans[i]-1]);
    printf("\n");
    return 0;
}
时间: 2024-10-26 11:15:25

USACO 5.4.2 以后在理解的相关文章

POJ 1946 Cow Cycling

Cow Cycling Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 2516   Accepted: 1396 Description The cow bicycling team consists of N (1 <= N <= 20) cyclists. They wish to determine a race strategy which will get one of them across the fin

USACO 3.3 TEXT Eulerian Tour中的Cows on Parade一点理解

Cows on Parade Farmer John has two types of cows: black Angus and white Jerseys. While marching 19 of their cows to market the other day, John's wife Farmeress Joanne, noticed that all 16 possibilities of four successive black and white cows (e.g., b

USACO Chapter 1 Section 1.1

USACO的题解和翻译已经很多了... 我只是把自己刷的代码保存一下. 1.PROB Your Ride Is Here 1 /* 2 ID:xiekeyi1 3 PROG:ride 4 LANG:C++ 5 */ 6 7 #include<bits/stdc++.h> 8 using namespace std ; 9 10 int main() 11 { 12 freopen("ride.in","r",stdin); 13 freopen(&quo

USACO 4.4.2 追查坏牛奶 oj1341 网络流最小割问题

描述 Description 你第一天接手三鹿牛奶公司就发生了一件倒霉的事情:公司不小心发送了一批有三聚氰胺的牛奶.很不幸,你发现这件事的时候,有三聚氰胺的牛奶已经进入了送货网.这个送货网很大,而且关系复杂.你知道这批牛奶要发给哪个零售商,但是要把这批牛奶送到他手中有许多种途径.送货网由一些仓库和运输卡车组成,每辆卡车都在各自固定的两个仓库之间单向运输牛奶.在追查这些有三聚氰胺的牛奶的时候,有必要保证它不被送到零售商手里,所以必须使某些运输卡车停止运输,但是停止每辆卡车都会有一定的经济损失.你的

bzoj2581 [USACO 2012 Jan Gold] Cow Run【And-Or Tree】

传送门1:http://www.usaco.org/index.php?page=viewproblem2&cpid=110 传送门2:http://www.lydsy.com/JudgeOnline/problem.php?id=2581 这题我一看就知道自己不会了,只想了个O(2^n * 2 ^ n)即O(2 ^ 2n)的大暴力,也懒得打了,果断看solution. 看了之后惊呆了,看到了一种从未见过,闻所未闻的树叫做And-Or Tree,百度了一下,并没有官方中文翻译,姑且叫他"

算法竞赛入门经典+挑战编程+USACO

下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成.打牢基础,厚积薄发.   一.UVaOJ http://uva.onlinejudge.org  西班牙Valladolid大学的程序在线评测系统,是历史最悠久.最著名的OJ.   二.<算法竞赛入门经典> 刘汝佳  (UVaOJ  351道题)  以下部分内容摘自:http://sdkdacm.5d6d.com/thread-6-1-1.html   "AO

USACO 2.2 Party Lamps 派对灯 (lamps)

题目描述 在IOI98的节日宴会上,我们有N(10<=N<=100)盏彩色灯,他们分别从1到N被标上号码.这些灯都连接到四个按钮: 按钮1:当按下此按钮,将改变所有的灯:本来亮着的灯就熄灭,本来是关着的灯被点亮. 按钮2:当按下此按钮,将改变所有奇数号的灯. 按钮3:当按下此按钮,将改变所有偶数号的灯. 按钮4:当按下此按钮,将改变所有序号是3*K+1(K>=0)的灯.例如:1,4,7... 一个计数器C记录按钮被按下的次数.当宴会开始,所有的灯都亮着,此时计数器C为0.你将得到计数器C

(Step1-500题)UVaOJ+算法竞赛入门经典+挑战编程+USACO

下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成.打牢基础,厚积薄发. 一.UVaOJ http://uva.onlinejudge.org 西班牙Valladolid大学的程序在线评测系统,是历史最悠久.最著名的OJ. 二.<算法竞赛入门经典> 刘汝佳  (UVaOJ  351道题)  以下部分内容摘自:http://sdkdacm.5d6d.com/thread-6-1-1.html “AOAPC I”是刘汝佳(大

USACO DEC 2019 参赛总结

USACO DEC 2019 参赛总结(2019-12-13~2019-12-16) 2019-12-19 xiaoh 金组Gold A-Milk Pumping 题意 给定一个n个点,m条边的无向图,每一条边都有一个最大流量f和一个价格c(1<=n,m<=1000,1<=c,f<=1000),找一条从1到n的路径(保证存在),求最大化Min{f}/Σ{c}的路径,将这个值×1e6取下整后输出 题解 首先,很明显,当流量最小值固定时,我们只要求满足条件的最小的Σ{c}即可.所以考虑