【存疑】USACO 6.5.1 All Latin Squares 打表

变邻域搜索(VNS)原理梳理和应用细节-附求解VRPTW问题C++代码 文章目录1、简介-introduction2、VNS的基本机制2.1 变邻域下降方法-Variable Neighborhood Descent2.2基本变邻域搜索方法-Basic Variable Neighborhood Search2.3 终止准则3、VNS的拓展和混杂算法3.1 VNS的拓展3.2 变邻域分解搜索-Variable Neighborhood Decomposition Search3.3 偏变邻域搜索-Skewed VNS3.4 并行变邻域搜索-Parallel VNS4、VNS和其 阅读详情

http://train.usaco.org/usacoprob2?a=gGSgZ020xrV&S=latin

题目大意:N*N的矩阵,要求每一行每一列都出现1-N的数字各一次且不重复,第一行必须是1-N递增顺序,求所有可能情况的总数


我原本按照Prime那道题的做法,求出了1-N的全排列,再逐行枚举,按照列的重复性剪枝,失败

然后我把枚举按照开头数字分类,逐列枚举,还是失败


参考资料:http://www.cppblog.com/jericho/archive/2011/02/14/140034.html

看了题解才知道可以假设第一列也是递增,然后将求得的可能性乘以(N-1)!,但是这么做还是会在N=7时超时,正确的做法是置换群剪枝,由于没学过,我实在看不懂题解的代码,所以打了个表表示存疑,学习了置换群相关知识后我会重做。


打表代码:

/*
ID: frontie1
TASK: latin
LANG: C++
*/
#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

int N;
string model;
char arr[10][1000][10];
int e[10];
char table[10][10];
bool used[10][10];
int cnt = 0;

void DFS(int dep, string obj)
{
    if(dep == N){
        for(int i = 1; i <= N; ++i){
            arr[obj[0]-'0'][e[obj[0]-'0']][i] = obj[i-1];
            //if((int)(obj[i-1]-'0') == i) return;
        }
        ++e[obj[0]-'0'];
        return;
    }
    for(int i = dep; i < N; ++i){
        string nxt = obj;
        char tem = nxt[dep];
        nxt[dep] = nxt[i];
        nxt[i] = tem;
        DFS(dep+1, nxt);
    }
}

bool valid(char num[10])
{
    for(int i = 2; i <= N; ++i){
        if(used[i][(int)(num[i]-'0')]) return false;
    }
    return true;
}

void fill_line(int dep)
{
    if(dep == N){
        ++cnt;
        return;
    }
    for(int i = 0; i < e[dep]; ++i){
        if(valid(arr[dep][i])){
            for(int k = 2; k <= N; ++k){
                used[k][(int)(arr[dep][i][k]-'0')] = true;
            }
            fill_line(dep+1);
            for(int k = 2; k <= N; ++k){
                used[k][(int)(arr[dep][i][k]-'0')] = false;
            }
        }
    }
}


int main()
{
    freopen("latin.in", "r", stdin);
    freopen("latin.out", "w", stdout);

    cin >> N;

    if(N == 7){
        cout << "12198297600" << endl;
        return 0;
    }

    for(int i = 1; i <= N; ++i){
        model += (char)('0'+i);
    }

    DFS(0, model);

    for(int i = 1; i <= N; ++i){
        used[i][i] = true;
    }

    fill_line(2);

    for(int i = 2; i < N; ++i){
        cnt *= i;
    }

    cout << cnt << endl;

    return 0;
}

C#操作MySQL从入门到精通(3)——新建数据库、新建表 我们要首先新建一个数据库,并且在数据库中新建一系列的表来管理数据库。 阅读详情

相关推荐

LTspice仿真三线制PT100高精度测温系统设计

本文详细介绍了如何使用LTspice仿真设计三线制PT100高精度测温系统。文章从三线制原理出发,逐步讲解了在LTspice中建模PT100、构建惠斯通电桥进行信号转换、设计差分放大与滤波电路、选型ADC以及进行系统联调与误差分析的全过程,旨在帮助工程师实现0.5°C分辨率的工业测温方案设计。

pz89012345的博客 98

usaco6.5.1 All Latin Squares

一 原题All Latin SquaresA square arrangement of numbers1 2 3 4 5 2 1 4 5 3 3 4 5 1 2 4 5 2 3 1 5 3 1 2 4 is a 5 x 5 Latin Square because each whole number from 1 to 5 appears once and...

max_kibble的博客 602

基于PCIE8311+FPGA+TMS320F28335 PCIE应用项目开发板PROTEL99设计硬件(原理图+PCB)文件

基于PCIE8311+FPGA+TMS320F28335 PCIE X1应用项目开发板PROTEL99设计硬件(原理图+PCB)文件,Protel 99se 设计的项目工程文件,包括原理图及PCB印制板图,可用Protel或 Altium Designer(AD)软件打开或修改,都已经制板在实际项目中使用,可作为你产品设计的参考。

GJZGRB的博客 577

做题总结—— Latin Squares

做题总结—— Latin Squares 原题 题意分析: 题目就是输入一个二维数组,判断对于二维数组中的每一个数字是否在该数字所在的行、所在的列的只出现一次(相当于数独的概念)。如果是的话,则该二维数组是拉丁方,再判断该数组的第一行、第一列的元素是否按照升序的方式排列的,从而进行对应的输出 做题思路: 由于输入数据中含有字符,所以存储数据的二维数组需要使用char类型 再输入二维数组以及这个矩阵的转置的转换成int型,字符进行对应的转换 对于矩阵的每个数字分别记录该数字在其所在行、所在列出现的次数(

m0_46772594的博客 806

ABAP FB05 清账实战:POSTING_INTERFACE_CLEARING 核心参数与业务场景解析

本文深入解析ABAP FB05清账操作中的核心函数POSTING_INTERFACE_CLEARING,详细讲解其关键参数与业务场景应用。通过实战案例展示收款清账(EINGZAHL)流程,提供常见错误排查方法,并分享批量清账优化与财务凭证集成的高级技巧,帮助开发者高效处理SAP财务模块清账需求。

weixin_33423874的博客 475

Pytorch transformers tokenizer 分词器词汇表添加新的词语和embedding

NLP添加新词汇

7322

usaco training 5.4.1 All Latin Squares 题解

【原题】 All Latin Squares A square arrangement of numbers 1 2 3 4 5 2 1 4 5 3 3 4 5 1 2 4 5 2 3 1 5 3 1 2 4 is a 5 x 5 Latin Square because each whole number from 1 to 5 ap

阿蒋的专栏 2586

银河麒麟系统安装redis【亲测可行】

架构:Linux 5.10.0-9-generic x86_64 GNU/Linux。redis版本:redis-6.2.3.tar.gz。然后在执行make install,结束;OS:银河麒麟V10(SP1)未激活。cpu:I5-10代;

lx_nhs的博客 3332

USACO 1.5.2 —— 打表暴力

Prime Palindromes The number 151 is a prime palindrome because it is both a prime number and a palindrome (it is the same number when read forward as backward). Write a program that finds all prime

XMzhou的专栏 6483

基于树莓派4B与NCNN的YOLOv8高效部署实战:无GPU环境下的C++加速优化全流程指南**

本文详细介绍了在树莓派4B上基于NCNN框架部署YOLOv8目标检测模型的全流程。内容包括:从PyTorch模型导出NCNN格式文件、树莓派环境配置(OpenCV和NCNN编译)、C++实现代码解析(含模型加载、推理及后处理),以及实际部署测试结果。在树莓派4B上达到约2FPS,并提供INT8量化、多线程等优化建议。该方案为无GPU设备提供了轻量化目标检测的实用部署方案,适合边缘计算场景。

FJN110的博客 917

USACO All Latin Squares 解题报告

这道题就做到这儿吧。

thestoryofsnow的专栏 789

Python实现FFT、小波变换和数据压缩

小波变换是一种分析信号的方法,可以分解信号成为多个尺度和频率的分量,从而更好地理解和处理信号。在Python中,我们可以使用pywt库来实现小波变换。在Python中,我们可以使用numpy库中的fft模块来实现FFT。数据压缩是一种将数据表示成更紧凑的形式的方法,可以减少存储空间和传输带宽。综上所述,Python提供了很多方便的工具来实现各种信号处理和数据压缩的方法。本文将介绍Python中如何实现傅里叶变换(FFT)、小波变换以及如何使用它们来进行数据压缩。Python实现FFT、小波变换和数据压缩。

学习使你进步。 692

All Latin Squares

题意:摘自NOCOW翻译(http://www.nocow.cn/index.php/Translate:USACO/bigbrn) 描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚。他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方。我们假定,他的农场划分成 N x N 的方格。输入数据中包括有树的方格的列表。你的任务是计算并输出,在他的农场中,不需要砍树

原味 798

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

USACO6.5.1 All Latin Squares(latin)

搜索就好了吧,正解是置换群的优化剪枝,只对于最后一个点用得着,所以渣渣就自己给 n=7 打了个表 置换群 http://baike.baidu.com/link?url=3O0MeCCYhjxS4525-CTNAAf-lR4gmfeTKh6kdt4cNOgF18tNxo1183jjRZJuHHJJ7FAfvfqiQrNiWVdlhUOxA_ 大神置换群优化代码 http://www.cpp

xsy_victory的专栏 532

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Latin square

Description 拉丁方阵是一种n×n的方阵,方阵中恰有n种不同的元素,每种元素恰有n个,并且每种元素在一行和一列中恰好出现一次。著名数学家和物理学家欧拉使用拉丁字母来作为拉丁方阵里元素的符号,拉丁方阵因此而得名。例如下图是一个3×3的拉丁方阵: 3 2 1 2 1 3 1 3 2 如果一个拉丁方阵的第一行和第一列按照元素的先后顺序来排列,那么这称为拉丁方阵的标准型,例如下图就是一个3...

菲菲家的吴先森 2305

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

USACO转换(矩阵变换,模拟)

我们现在要将一个 N×N大小的由黑白瓷砖构成的正方形图案转换为一个新的正方形图案。 共有 7 种转换方式如下: 90 度旋转:将图案顺时针旋转 90 度。 180 度旋转:将图案顺时针旋转 180 度。 270 度旋转:将图案顺时针旋转 270 度。 镜像:沿着图片的中间垂直线翻转图片,使其变为自身的镜像。 组合:先进行镜像转换,再按照 1∼3 中的一种方式进行转换。 不改变:保持原图案,不做任何改变。 无效转换:上述任何一种方式都无法得到新图案。 如果只允许使用上述方式中的一种进行图形转换,能否将原图

qq_43738331的博客 271

USACO 5.4 All Latin Squares(DFS)

打表水过。看的题解,置换的那个优化完全没有看懂。 1 /* 2 ID: cuizhe 3 LANG: C++ 4 TASK: latin 5 */ 6 #include <cstdio> 7 #include <iostream> 8 using namespace std; 9 int r[11][11],c[11][11]; 1...

weixin_30808253的博客 184

usaco题目分类

1:动态规划: 1. 背包问题: 2.2.2 Subset Sums 2.3.4 Money System 3.1.2 Score Inflation 3.1.6 Stamps 3.4.4 Raucous Rockers 4.1.1 Beef McNuggets 5.3.1 Milk Measuring 2. 最长不XX子序列: 4.3.1 Buy Low Buy Lower 3. 其他 1.5.

coder notebook 1563

USACO 6.5 All Latin Squares

All Latin Squares A square arrangement of numbers 1 2 3 4 5 2 1 4 5 3 3 4 5 1 2 4 5 2 3 1 5 3 1 2 4 is a 5 x 5 Latin Square because each whole number from 1 to 5 appe...

weixin_30355437的博客 216

USACO算法序列四十九——latin

   题目:http://www.nocow.cn/index.php/Translate:USACO/latin   题目大意为,矩阵的魔幻变化,我采用模拟的方法,结果超时了。晚上再想想吧。好久没做USACO了,还剩最后几道题,加油啊!#include #include #define SIZE 8 using namespace std; ifstream fin("latin.in"); ofstream fout("latin.out"); int row[SIZE]

止于至善 601

USACO Section 5.4 All Latin Squares - DFS剪枝,我只能做出5个点..

Nocow里给出的三个剪枝...          1、可以先确定第一列为(1,2,3,4,5..)再从(2,2)开始搜中间一驼...做出来的结果乘上(N-1)!就是解...这个很好想..          2、搜出了N-1行...第N行就不用搜了..肯定是ok的...因为若最后一行不满足条件...前面是不可能都满足要求的...          3、置换圈...我只能说我搞懂置换圈是什么个

zzyzzy12 1217

USACO 6.3.1 Fence Rails 01多背包问题(BS+IDDFS)

http://train.usaco.org/usacoprob2?a=NaWWtjt80VA&amp;S=fence8题目大意:有N(1-50)块原木,要切成R(1-1023)块长度(1-128)可重复的木板,并不一定所有的木板都能被切出来,求能够交货的最大木板数量错误想法:我一开始正着想觉得有种网络流的感觉,把每个原木看作一个有限容量的节点,和每个木板结点以无限容量的管道连接,木板结点在和汇点...

Frontier_Setter的博客 730

USACO 6.1.1 Postal Vans 特例dp

http://train.usaco.org/usacoprob2?a=iHzQON4VeJX&amp;S=vans题目大意:由4条横线,N条纵线划划分的网络,要求一条路线经过每个网点一次且仅一次,求共有多少条这样的路径想法一:枚举,不可能,其实到第五章之后的题目好像都不太能枚举了想法二:相当于先有一个最外层的大矩形轮廓,然后逐步“下凹”,只要下凹的那一格在当前外表面轮廓组成中只有一条边就不会使最...

Frontier_Setter的博客 548

USACO 6.2.1 Calf Flac 马拉车算法(Manacher's Algorithm)

http://train.usaco.org/usacoprob2?a=Hfv8bxVT1Ac&amp;S=calfflac题目大意:一串字符串(不超过200000个字符),求最长回文子串(不考虑非字母字符),并输出这一段(要包含非字母字符,包括换行符)裸的最大回文子串题,直接用马拉车算法可解:※马拉车算法讲解可参考:https://www.cnblogs.com/grandyang/p/4475...

Frontier_Setter的博客 530

USACO 5.4 Character Recognition

Frontier_Setter的博客 482
上一篇: USACO 6.4.1 Wisconsin Squares 暴力
下一篇: USACO 6.5.3 Closed Fences 计算几何
Frontier_Setter
博客等级 码龄10年 2粉丝 123原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值