uva1631 Locker 记忆化搜索

UVa 1631 Locker(DP) 题意 有一个NNN(N≤1000N\leq1000N≤1000)位密码锁,,每位都是0~9,可以循环旋转。 每次可以让1~3个相邻数字同时往上或者往下转一格。 例如,567890->567901(最后3位向上转)。 输入初始状态和终止状态(长度不超过1000),问最少要转几次。 例如,111111到222222至少转2次,由896521到183995则要转12次。 思路 首先从搜索的角度上去... 阅读详情

自己想用d[I][j],  然后不会了。。

然后看别人的题解,感觉好巧妙。。

他这里之所以枚举是因为  1000*10*10*10   用了记忆化搜索后并不会TLE ,

可能自己连暴力, 模拟的这一块都还么有搞清楚。。


#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<string>
#include<cstring>
#include<iomanip>
#include<iostream>
#include<stack>
#include<cmath>
#include<map>
#include<vector>
#define ll long long
#define inf 0x3f3f3f3f
#define INF 1e9
#define bug1 cout<<"bug1"<<endl;
#define bug2 cout<<"bug2"<<endl;
#define bug3 cout<<"bug3"<<endl;
using namespace std;
#define sf scanf
#define pf printf
#define mem(a,b) memset(a,b,sizeof(a));
const int maxn=1005;
char a[maxn],b[maxn];
int s[maxn],t[maxn];
int len;
int d[maxn][12][12][12];
int dp(int cur,int x,int y,int z){
    if(cur>=len)return 0;
    int &ans=d[cur][x][y][z];
    if(ans!=-1)return ans;
    ans=INF;
    int tmp;
    if(x<=t[cur])tmp=t[cur]-x;
    else tmp=t[cur]+10-x;
    for(int i=0;i<=tmp;++i){
        for(int j=0;j<=i;++j){
            ans=min(ans,dp(cur+1,(y+i)%10,(z+j)%10,s[cur+3])+tmp);
        }
    }
    if(x>=t[cur])tmp=x-t[cur];
    else tmp=x+10-t[cur];
    for(int i=0;i<=tmp;++i){
        for(int j=0;j<=i;++j){
            ans=min(ans,dp(cur+1,(y-i+10)%10,(z-j+10)%10,s[cur+3])+tmp);
        }
    }
    return ans;
}
int main(){
    while(~scanf("%s%s",&a,&b)){
        mem(d,-1);
        len=strlen(b);
        for(int i=0;i<len;++i){
            s[i]=a[i]-'0';
            t[i]=b[i]-'0';
        }
        s[len]=s[len+1]=t[len]=t[len+1]=0;
        pf("%d\n",dp(0,s[0],s[1],s[2]));
    }
}


【DP 训练】Locker, Tianjin 2012, UVa1631 #include using namespace std; #define maxn 1010 int len;char s1[maxn],s2[maxn]; int dp[maxn][15][15],a[maxn],b[maxn]; //dp(i,x,y)表示翻到i位第i+1位为x,第i+2位为y的最小步数,枚举上翻状态,找到正翻和倒翻的最小值。 int main() { ios::sync_ 阅读详情

相关推荐

PC微信逆向) 读取内存联系人链表

首先从一些网络上搜索到的信息可以得出联系人列表是保存在内存里的,并且是全局变量不会被释放,所以我们可以通过搜索某个联系人的信息来定位

Qwertyuiop2016的博客 2919

Uva 1631 DP locker

Description  给定n位密码锁。每次可以使相邻的1-3位密码锁同时向上或向下转,即,使数字加一或者减一。给定初始状态和目标状态,问至少要转多少次。 Input  初始密码 目标密码 Output 最少的次数  Sample Input  896521 183995 Sample Output  12   这是一道简单的DP题。但是最开始我写出的状态转移方程显然没

Star_Weeper的博客 588

从VBA到Python:探索CODE V API在MTF数据分析中的跨语言实践

本文详细介绍了如何从VBA转向Python,利用CODE V API实现MTF数据分析的高效工作流。通过Python的科学计算库和现代API设计,光学工程师可以大幅提升数据处理和可视化效率,实现自动化报告生成和性能优化。

weixin_29239661的博客 441

Locker UVA - 1631

题意:有一个n(n&lt;=1000)位密码锁,每位都是0~9,可以循环旋转。每次可以让1~3个相邻数字同时往上或者往下转一格,问最少要转几次; 思路:1.记忆化搜索。d[cur][x][y][z]代表当前第cur位为x,右边两位是y,z并且一定要把第cur位转到正确位置 2.第cur位必须要转tmp位,但是右边相邻的第一位可以有0~tmp位和第cur位一起转,设右边相邻第一位转了i次,右边相...

沐妖的博客 309

【分布式系统学习】CAP原理详解

概述:互联网最重要任务莫过于海量数据处理,即大规模分布式系统,分布式是互联网的核心技术!!!如上所述,分布式系统是无法同时满足CAP三个特性的。1.Atomicity(原子性)一个事务中的所有操作,要么全部完成,要么全部不完成,不会在中间某个环节结束。事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务从来没有执行过一样。2.Consistency(一致性)在事务开始之前和事务结束以后,数据库的完整性没有被破坏。3.Isolation(隔离性)

大龄烤红薯的博客 5024

数据库小技能:数据导入脚本

背景:版本大升级,从2.0升级到3.0 ,服务端开发语言从c#换到java语言。数据库类型从microsalft sql server 换到mysql。数据来源于微信,用于查询卡bin。

专注于计算机研发知识和资讯分享 774

uva1631

题意:有一个n(n≤1000)位密码锁,每位都是0~9,可以循环旋转。每次可以让1~3个相邻 数字同时往上或者往下转一格。例如,567890->567901(最后3位向上转)。输入初始状态 和终止状态(长度不超过1000),问最少要转几次。例如,111111到222222至少转2次,由 896521到183995则要转12次。 分析:分成两种情况向上转和向下转,题目说可以同时转1~3,所以...

timeruler的博客 433

[HBM] RAM Cell Self Repair | 内存单元自我修复

对抗错误的大都是冗余,内存颗粒在设计的时候也考虑增加冗余。具体的说:添加冗余或备用的存储单元行和列,及时将测试中的故障进行修复和替换,存储器修复包括行修复,列修复或两者的组合。

串起点滴 785

Uva1631_分阶段动态规划

动态规划训练2——Uva1631                     Locker A password locker with N digits, each digit can be rotated to 0-9 circularly. You can rotate 1-3 consecutive digits up or down in one step. For examples: 56...

qq_42663062的博客 385

Cursor使用教程:用 Cursor 创建第一个 Java 项目

Cursor是一款基于VS Code的AI编程编辑器,专为开发者设计。安装前需确保JDK 8+、Maven 3.8+等环境配置,支持Windows系统。编辑器提供中文界面选项,可通过扩展市场安装语言包。创建Java项目支持手动和AI提示词两种方式:手动需创建目录结构并编写代码;AI方式则通过自然语言描述快速生成项目框架和代码。标准Java项目包含src/main/java主代码目录、src/test/java测试目录及pom.xml等配置文件。Maven项目中,pom.xml是核心配置文件,管理项目依赖与构

博客 3547

8.DJI-PSDK:一站式项目功能开发总结(空中气象站项目/激光甲烷检测项目)

本文将以一篇文章的幅度快速完成: 项目一:空中气象站项目; 项目二:激光甲烷项目; 项目所使用的PSDK来源于第0章节末尾的百度网盘;解压:Payload-SDK-3.8.zip代码所在目录:双击打开: 修改打印串口和相关波特率,我们修改如下: 进行相关编译选项配置如下: :

哒宰的博客 294

UVa-1631 密码锁 (记忆化搜索)

题目链接:https://vjudge.net/contest/232314#problem/L 给定两个数字字符串,每次操作只能将相邻的1-3位数字向上或向下旋转1位,问从第一个字符串到第二个字符串最少需要多少步。 很经典的记忆化搜索问题,用dp[i][a][b][c]表示前i-1位已经旋转好了,第i位为a,第i+1位为吧,第i+2位为c时,将这三位旋转好的最小移动次数。那么首先,第i位旋转...

Q755100802的博客 410

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

UVA - 1631 Locker 记忆化搜索

题意:给定两个密码串,每次可以让1~3个相邻的密码向上或者向下滚动,每个密码是0−90-9 ,问最少需要多少次滚动可以让原串成为目标串?思路:假设当前要让第i位密码还原,我们可以同时转动[i,i+1,i+2],[i,i+1],[i][i,i+1,i+2], [i,i+1],[i],不同的转动方式会影响后序的转动,那么可以枚举(i,i+1,i+2)(i,i+1,i+2)三个密码的转动情况来进行记忆化搜

flyawayl的博客 900

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

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

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

UVA - 1631 Locker 记忆化搜索

问题 分析

zpf1998的博客 246

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

uva1631-Locker(记忆化搜索)

Description A password locker with N digits, each digit can be rotated to 0-9 circularly. You can rotate 1-3 consecutive digits up or down in one step. For examples: 567890 → 567901 (by rotating the l...

你倒是敲代码鸭. 588

UVA - 1631 Locker(记忆化搜索)

题目链接 1.首先如果只转动一位,那么不难发现每一位是互不影响的。而本题可以同时最多转动三位。那么我们不难发现,因为第二位第三位什么决策最优是未知的,但是当前位最少的转动次数是一定的(要么向上要么向下)。在将第一位转动到正确位置的过程中,第二位第三位可以转也可以不转,那么我们需要枚举所有的情况进行状态转移 2.然后观察上图,原位置设为aaa,目标未知设为bbb,因为二者的大小关系是不确定的,但是一共只有十位,因此我们无需分类讨论,只需使用取模的技巧: 若向上转,则需要u=(b[cur]+10−x)u=

Happig的博客 342

UVA - 1631 Locker(密码锁)(dp---记忆化搜索)

题意:有一个n(n<=1000)位密码锁,每位都是0~9,可以循环旋转。每次可以让1~3个相邻数字同时往上或者往下转一格。输入初始状态和终止状态(长度不超过1000),问最少要转几次。 分析: 1、从左往右依次使各个数字与终止状态相同。 2、dp[cur][x1][x2][x3]表示当前研究数字为第cur位,x1为a[cur],x2为a[cur + 1],x3为a[cur +...

Cherrychan2014的博客 404

【UVa】【DP】1631 Locker

UVa 1631 Locker 题目 ◇题目传送门◆(由于UVa太慢,这里提供一个vjudge的链接) ◇题目传送门(vjudge)◆ 题目大意 有一个NNN位的数字密码锁,每位数字可以在0…90…90\ldots9之间旋转。可以同时旋转一到三个。现给定初始状态和最终状态,求最少旋转次数。 思路 这道题我感觉使用递推来转移似乎很困难,所以我们使用记忆化搜索。 定...

IDDFS 1407

uva 1631

1631 Locker A password locker with N digits, each digit can be rotated to 0-9 circularly. You can rotate 1-3 consecutive digits up or down in one step. For examples: 567890 → 567901 (by rotating t...

weixin_30556161的博客 93

uva1631(DP记忆化搜索)

/* translation: 有一串密码锁,每次能够让相邻的1~3位数字向上或者向下旋转一格。给出目标状态和起始状态,问最少需要旋转几次? solution: 记忆化搜索dp 令dp(int pos, int a, int b, int c)其中pos是当前的位置,a,b,c分别是pos,pos+1,pos+2上的数字。此时 pos前面的位置都已经旋转完毕,不需要再次旋转了。那么就可以求

林伏案的博客 1104

uva 1631 locker

题目大意:给出两串长度为n(n 求源串最少多少步能变成目标串。 一看就知道是dp的题目,这题状态不难想d(i,x,y)表示转好第i个数且第i+1个数为x,i+2个为y 时候所用的最少次数直接枚举 i+1个数和i+2个数分别转动的次数就好了 另一个坑在于,i+1,i+2溢出怎么处理,比较平庸的是单独讨论。。。 在数组后面加了两个0,这样不仅代码长度缩短,而且最终状态也是固定的 //

chenhongwei6447的博客 1168

Locker UVA - 1631 (dp)

题目链接:点击打开链接 题目大意:给出一个密码锁的当前状态和最终状态,每一次可以将连续的1~3个向上或者向下转动,问最少要转几次 题目思路:很容易知道是dp题但是还是比较难想出状态转移和定义状态的,如果是第一次写这种类型,首先定义状态dp[i][j][k],代表第i位,第i位为j,i+1位为k,还需转动几次, 为什么要这么定义呢,首先我们知道对于每一位来说肯定是要转到和目标状态相同的,那

w571523631的博客 707

uva 1631——Locker

题意:有一个n位的密码锁,每位都是0——9可以循环旋转,每次可以往上或者往下旋转一下,然后给定初始状态和末状态求最小旋转步数。 思路:递推,dp(i,x,y)表示翻到i位第i+1位为x,第i+2位为y的最小步数,枚举上翻状态,找到正翻和倒翻的最小值。 code: #include using namespace std; #define cls(a,c) memset(a

坚持不懈 1096
上一篇: poj2502 关于输入部分的坑。。
下一篇: uva10163 Storage Keepers (未能自己敲出来)
sega_handsome
博客等级 码龄10年 7粉丝 164原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值