USACO 6.1.1 Postal Vans 特例dp

Usaco Training Section 6.1 Postal Vans Postal Vans 邮政货车 郊区呈矩形,有四条东西方向的街道和N(1<=N<=1000)条南北方向的街道.在交区的西北角有 一个邮局. 如N=5 时,郊区如右图所示,圆点表示邮局,直线表示街道. 每天邮政卡车从邮局出发,每个十字路口(包括边界和四角)经 过且只经过一次.现在邮局希望知道邮政货车行驶的路线有几种. PROGRAM NAME: vans INPUT FORMAT 一行... 阅读详情

http://train.usaco.org/usacoprob2?a=iHzQON4VeJX&S=vans

题目大意:由4条横线,N条纵线划划分的网络,要求一条路线经过每个网点一次且仅一次,求共有多少条这样的路径


想法一:枚举,不可能,其实到第五章之后的题目好像都不太能枚举了

想法二:相当于先有一个最外层的大矩形轮廓,然后逐步“下凹”,只要下凹的那一格在当前外表面轮廓组成中只有一条边就不会使最后的结果缺失某个点,而且N确定时下凹的次数是固定的,但是要找到下凹的位置麻烦

想法三:与下凹相反,在网络中选择格子形成一个联通的区域,N确定时格子总数也是确定的,但是要求选择区域在任意位置宽度为一且四角的格子要被包含在这个区域中


正解:基于连通性状态压缩的动态规划

说实话以我现在的能力看不太懂,但这个方法绝对是具有普适性的,所以等以后再好好学习

链接:https://wenku.baidu.com/view/a6dce6c76137ee06eff918d1.html 陈丹琦


特解:因为这道题在横向上只有四条线,所以可以用普通的dp方法处理,真的妙

链接:http://blog.youkuaiyun.com/jiangshibiao/article/details/21446033

需要注意的一点就是最后的结果很大,当N = 1000时,结果的位数有400+位,需要自定大数类

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

using namespace std;

struct number
{
    int arr[500];
    int length;

    number()
    {
//        for(int i = 0; i < 100; ++i){
//            arr[i] = 0;
//        }
        length = 1;
    }

    number operator+(const number &obj)
    {
//        this->print();
//        cout << " + ";
//        obj.print();
//        cout << " = ";
        number output;
        int cur1 = 0, cur2 = 0, cur3 = 0;
        int up = 0;
        while(cur1 < length && cur2 < obj.length){
            output.arr[cur3] = arr[cur1] + obj.arr[cur2] + up;
            up = output.arr[cur3] / 10;
            output.arr[cur3] %= 10;
            ++cur1; ++cur2; ++cur3;
        }
        while(cur1 < length){
            output.arr[cur3] = arr[cur1] + up;
            up = output.arr[cur3] / 10;
            output.arr[cur3] %= 10;
            ++cur1; ++cur3;
        }
        while(cur2 < obj.length){
            output.arr[cur3] = obj.arr[cur2] + up;
            up = output.arr[cur3] / 10;
            output.arr[cur3] %= 10;
            ++cur2; ++cur3;
        }
        if(up){
            output.arr[cur3] = up;
            ++cur3;
        }
        output.length = cur3;
//        output.print();
//        cout << endl;
        return output;
    }

    number operator-(const number &obj)
    {
//        this->print();
//        cout << " - ";
//        obj.print();
//        cout << " = ";
        number output;
        int cur1 = 0, cur2 = 0, cur3 = 0;
        int down = 0;

        while(cur1 < length && cur2 < obj.length){
            output.arr[cur3] = arr[cur1] - obj.arr[cur2] - down;
            if(output.arr[cur3] < 0){
                //cout << output.arr[cur3] << " occurred" << endl;
                output.arr[cur3] += 10;
                down = 1;
            }
            else down = 0;
            ++cur1; ++cur2; ++cur3;
        }
        while(cur1 < length){
            output.arr[cur3] = arr[cur1] - down;
            if(output.arr[cur3] < 0){
                output.arr[cur3] += 10;
                down = 1;
            }
            else down = 0;
            ++cur1; ++cur3;
        }
        while(output.arr[cur3-1] == 0) --cur3;
        output.length = cur3;
//        output.print();
//        cout << endl;
        return output;
    }

    void print() const
    {
        for(int i = length-1; i >= 0; --i){
            cout << arr[i];
        }
    }
};

int N;

number f[1010];
number g[1010];

//int f[1010];
//int g[1010];


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

    cin >> N;

//    f[1] = 0; f[2] = 2;
//    g[1] = 2; g[2] = 2;
//
//    for(int i = 3; i <= N; ++i){
//        f[i] = g[i-1] + f[i-1];
//        g[i] = 2*f[i-1] + g[i-1] + g[i-2] - g[i-3];
//        cout << f[i] << '\t' << g[i] << endl;
//    }

    f[1].arr[0] = 0; f[2].arr[0] = 2; f[3].arr[0] = 4;
    g[1].arr[0] = 2; g[2].arr[0] = 2; g[3].arr[0] = 8;


    for(int i = 4; i <= N; ++i){
        f[i] = g[i-1] + f[i-1];
        g[i] = ((f[i-1] + f[i-1]) + (g[i-1] + g[i-2])) - g[i-3];
//        f[i].print();
//        cout << '\t';
//        g[i].print();
//        cout << endl;
    }

    f[N].print();
    cout << endl;
//    cout << f[N].length << endl;

//    for(int i = f[N].length-1; i >= 0; --i){
//        cout << f[N].arr[i];
//    }
//    cout << endl;


    return 0;
}

告别if-else:用SDF函数式思维优雅处理2D图形碰撞与距离场 本文探讨了符号距离函数(SDF)在2D图形碰撞检测与渲染中的应用,展示了如何通过函数式编程思维大幅提升性能和代码简洁性。SDF方法不仅减少80%的代码量,还能实现300%的性能提升,特别适用于游戏开发和交互设计中的复杂图形处理。 阅读详情

相关推荐

手把手教你逆向京东搜索接口:H5ST 556位参数生成与V8补环境技巧

本文深入解析了京东搜索接口中关键的H5ST 556位参数生成机制,并提供了详细的逆向实战指南。针对其复杂的反爬虫环境检测,文章重点介绍了通过链式补环境技巧,在Node.js中完整模拟浏览器环境(包括原型链检测和指纹验证)的方法,帮助开发者成功绕过防护并生成有效参数。

weixin_29315091的博客 481

usaco training 6.1.1 Postal Vans 题解

预备知识: 哈密度路:由一个点出发到另外一个点结束,要求经过图中所有的点的一条路(不能重复经过点)。 哈密顿回路:从一个点出发再回到此点,经过图中所有点的一条路(不能重复经过点)。 问题显然的解法:对于一个n*4的图求哈密顿回路的个数。用陈丹琦的方法。 但是由于宽度只有4,所以有另外一种递推的方法,达到优化的目的: 设f[i]为前i列中,第i列的第一个格子到第二个格子的哈密度路的条数。(显然,f[n]就为答案) 1 2 3 。。i-1 i 设g[i]为前i

阿蒋的专栏 4416

FPGA进位链(Carry Chain)实战:从Xilinx CARRY8原语到性能优化全解析

本文深入解析了FPGA进位链(Carry Chain)的原理与应用,重点剖析了Xilinx CARRY8原语的端口功能与内部机制。通过实测数据揭示了进位链的真实延迟特性与温度影响,并详细阐述了如何利用DI和S信号进行动态路径优化、实现减法运算与条件进位选择,从而有效提升设计性能。最后,文章探讨了系统级的流水线拆分、布局约束等实战优化策略与常见陷阱。

weixin_29313817的博客 451

Postal Vans

题意:摘自NOCOW翻译(http://www.nocow.cn/index.php/Translate:USACO/rectbarn) 描述 到底是个资本家,Farmer John想通过买更多的奶牛来扩大它的生意。它需要给奶牛建造一个新的牛棚。 FJ买了一个矩形的R(1 对同一个损坏区域可能有多次描述 题目名称:rectbarn [编辑]输入格式(file r

原味 1004

MFRC522防冲突机制详解:当两张IC卡同时靠近读写器,会发生什么?

本文深入解析了MFRC522芯片在多张IC卡同时靠近RFID读写器时的防冲突机制,重点介绍了二叉树搜索算法在比特级的实现原理。通过详细的寄存器配置优化和实际工程案例,展示了如何有效解决信号碰撞问题,提升多卡场景下的读写性能。

weixin_29191669的博客 429

llama.cpp部署大模型

llama.cpp如何部署大模型

Eddy的博客 976

usaco 6.1 Postal Vans(插头DP)

Postal Vans ACM South Pacific Region -- 2003 Tiring of their idyllic fields, the cows have moved to a new suburb. The suburb is a rectangular grid of streets with a post office at its Northwest

志当存高远 1121

论文分栏前后内容不连续?教你word如何删除分节符

问题 当我们在写论文的时候,很多期刊的模板都是两栏的格式,但有的时候我们插入的图像尺寸可能太大,两栏格式放不下,因此需要将其以一栏的格式出入,如下: 但当我们把图片删除后,再将其转换成两栏格式,前后内容就出现不连续的情况: 正常情况下应该是如下: 正确处理方式 里面有个分页符,把分页符去掉,或者把你的文字全部复制到记事本里,然后重新复制回word就可以取消原有的格式了。 删除分节符的方法(以word 2019为例) -点击菜单栏上的“视图”,点击“大纲视图”。 可以看到word文档以整列的形式展开:

左手の明天的博客 1万+

usaco6.1.1 Postal Vans

一 原题 Postal Vans ACM South Pacific Region -- 2003 Tiring of their idyllic fields, the cows have moved to a new suburb. The suburb is a rectangular grid of streets with a post office at its

max_kibble的博客 559

【RT-DETR创新改进】改进前必看!对Ultralytics调参, 1:1还原RT-DETR官方版本实验参数,使用原汁原味的RT-DETR模型,才能高效跑实验、高效涨点、收割小论文、完成大论文!!!

本文针对Ultralytics训练RT-DETR精度不佳问题,提供参数配置优化方案。通过对比官方RT-DETR参数设置,详细指导如何修改Ultralytics版本的关键参数,包括优化器、学习率、权重衰减等6处配置调整。操作步骤涵盖default.yaml文件修改和trainer.py代码调整,确保模型收敛性能达到官方水平,帮助研究者快速提升实验效果。文末附官方源码链接和具体参数配置网址供参考。

Ai缝合怪、助力小伙伴高效发论文 1775

Esp32蓝牙Hid调用方案 http执行设备、鼠标、键盘相关操作

本文主要介绍 Esp32 蓝牙 Hid 相关的多种操作方式,详细的设备、鼠标、键盘相关操作的 http 调用方法。下面是整理出的所有 http 调用方法和 rhino 引擎方式。本机调用的话直接使用http://localhost:8080 如果是局域网调用则使用软件里的地址 比如我的是http://192.168.1.5:8080。文件地址: https://www.123865.com/s/Qtm4jv-xyZbd?使用前需要一块烧录好的ESP32板子并在手机安装好embedded软件用于蓝牙通信。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 569

USACO6.1.1Postal Vans(vans)

插头dp(基于连通性状态压缩的动态规划)问题  什么是插头dp看陈丹琪的论文,她的写法也是目前为止的标准写法吧 http://wenku.baidu.com/link?url=VGHZwf6zGOFGKRN8DCKHPi6BJApgXYBsnk2CDXByfOYmwxToQoOJWi64MgEf1v5qWRuounu4y8xT_T_UuJb-XuYvjEgAzjRhaUK6HPO6szK 对

xsy_victory的专栏 644

5ZCM6ZGrVDllSFLkv6Hmga/ljJbnrqHnkIbns7vnu58= GetFlowDropDown SQL注入

5ZCM6ZGrVDllSFLkv6Hmga/ljJbnrqHnkIbns7vnu58=、eHR/OA一体化智慧云平台、智慧一卡通云平台、行业软件开发与定制、智慧企业管理信息化咨询与项目服务为核心业务的顾问式管理咨询和软件个性定制开发的高科技股份集团公司。同鑫T9eHR信息华管理系统存在SQL注入漏洞,攻击者可通过该漏洞上传shell。关闭互联网暴露面或接口设置访问权限。利用sqlmap进行shell。

iSee857的博客 700

USACO6.1.1 Postal Vans (vans) 插头dp

题意:一个4*n的矩阵,从左上角出发,经过每个顶点恰好1次回到左上角,问有多少种走法。 第一道插头dp……磕磕绊绊总算过了…… 什么是插头dp请参考cdq的论文《基于连通性状态压缩的动态规划问题》。 注意同样的路径,正着走和反着走算两条不同的,所以最后答案要乘2。 然后加上高精就行了。 代码(括号表示法): /* ID:shijiey1 LANG:C++ PROG:vans */

Shion的专栏 801

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

USACO 6.1 Postal Vans(一道神奇的dp)

Postal Vans ACM South Pacific Region -- 2003 Tiring of their idyllic fields, the cows have moved to a new suburb. The suburb is a rectangular grid of streets with a post office at its Nort...

weixin_30471065的博客 215

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

usaco Postal Vans(dp)

是哈密顿回路,然后。。。就不知道怎么写了 ,以前写过类似的不过情况没这么多也没这么复   usaco training 6.1.1 Postal Vans 题解 标签: usaco training题解dp 2014-03-18 10:49 1511人阅读 评论(0) 收藏 举报  分类: usaco题解(46)  版权声明:本文为

silence401的博客 944

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

[usaco6.1.1Postal Vans]

来自FallDream的博客,未经允许,请勿转载,谢谢。 给你一个4*n的棋盘,问从(1,1)出发恰好经过所有格子一次的走法数量.(n<=1000) 插头dp,用f[i][j][k]表示转移到第i行第j列,插头的状态是k的方案数,套上高精度。 假设要转移到格子(i,j) 前一个格子的右插头是p,上一个格子的下插头是q, p和q都没有插头时,现在这个格子显然只能有向右和向下的...

weixin_30745553的博客 141

USACO 6.1解题报告

Postal Vans题目翻译:http://www.nocow.cn/index.php/Translate:USACO/vans计算哈密顿回路。实际上有递推式(需要使用高精度),可以使用矩阵快速幂加速,但是不使用矩阵快速幂也可以通过本题。 f[1]=0,f[2]=2,f[3]=4,f[4]=12; f[i]= 2*(f[i-1]+f[i-2]-f[i-3])+f[i-4];A Rectang

SmallSXJ的博客 537

[USACO 6.1.1]Postal Vans

题目大意   给一个4*n的矩阵,矩阵看成无向图,求哈密顿回路方案数. 题解   看了题解才懂.不然身为蒟蒻的我怎么可能推出递推式23333   附网址http://blog.csdn.net/jiangshibiao/article/details/21446033   代码和上面的有所不同. 代码 /* TASK:vans LANG:C++ */ #include &...

weixin_30770783的博客 159

USACO vans

USACO 在参考了网上的众多资料之后终于给我搞掉了!~ 这道题能做出来完全归功于 新野 的http://sinya.yo2.cn/postal-vans的详尽的解题报告这个解题报告写的是我读过的最详细最易懂也是最好的报告/*ID: biran001PROG: vansLANG: C++*/#include#include#define FOR(

biran007的专栏 715

usaco6.1.2 A Rectangular Barn

一 原题 A Rectangular Barn Mircea Pasoi -- 2003 Ever the capitalist, Farmer John wants to extend his milking business by purchasing more cows. He needs space to build a new barn for the cows. F

max_kibble的博客 514

USACO Postal Vans 解题报告

这道题我是用偷懒的方法做的。在topcoder论坛上面看到大名鼎鼎的msg555也是用de

thestoryofsnow的专栏 810

USACO 6.1.2 A Rectangular Barn 单调栈

http://train.usaco.org/usacoprob2?S=rectbarn&amp;a=iHzQON4VeJX题目大意:一个R*C的方格阵,有P个无效格,求不包含无效格的矩形的最大面积错误想法一:①对每个位置求出离他最近的左侧无效格到他的距离 ②遍历每个格子,向上伸展直到遇到无效格,在这个过程中计算以该长条为边的矩形的面积时间复杂度是N^3的,而且需要一个R*C的数组,在这道题里是3...

Frontier_Setter的博客 476

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 5.5.3 Twofive 记忆式搜索+枚举
下一篇: USACO 6.1.2 A Rectangular Barn 单调栈
Frontier_Setter
博客等级 码龄10年 2粉丝 123原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值