习题9-8 uva1631
题意:
给你一串密码,每次我们可以转动1-3个数字,求转出最终答案的最小步数
思路:
感觉自己好坑,最开始想的是dp[cur][t1][t2][t3]也就是t1的位置以及连续的三个数的状态
但是卡死循环了,于是乎改成dp[cur][t1][t2](当前的位置以及它后面的数的状态)
每次求出当前位置转到正确答案时要的步数,然后枚举3种情况(也就是后面两个数是否一起转动)
但是中途发现思路有问题,111 --> 322 这种它会给出答案三,然而应该是2
(感觉最近课真的多,还要考试- -,都没时间做题)
通过上面那个例子发现,当前位置并不是一次旋转到正确答案是最优解(感觉思考问题是太片面了)
可能自己选转几格,再带动后面两个转动,322 -> 222 -> 111
所以对于后两个的可能枚举0 --> t(t为转动到正确答案的步数)
而且t2转动的步数≥a[cur+2]步数,因为第三个位置转动的前提便是t2转动
所以得出个循环,然后记忆化搜索
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <queue>
#include <vector>
#include <algorithm>
#include <functional> using namespace std;
const int maxn = 1005;
const int INF = 0x3f3f3f3f;
char str1[maxn];
char str2[maxn];
int a[maxn];
int b[maxn];
int dp[maxn][10][10];
int len; int up(int s,int t) //上旋
{ if(s >= t)
return s-t;
else
return (s-t+10)%10;
} int down(int s,int t) //下旋
{ if(t >= s)
return t-s;
else
return (t-s+10)%10;
} int DFS(int cur,int t1,int t2)
{
if(cur >= len)
return 0;
if(dp[cur][t1][t2] != -1)
return dp[cur][t1][t2];
int t = up(b[cur],t1);
int ans = INF; for(int i = 0; i <=t; i++) //枚举后个数的情况
for(int j = i; j <= t; j++)
{
ans = min(ans,DFS(cur+1,(t2+j)%10,(a[cur+2]+i)%10) + t);
} t = down(b[cur],t1);
for(int i = 0; i <=t; i++)
for(int j = i; j <= t; j++)
{
ans = min(ans,DFS(cur+1,(t2-j+10)%10,(a[cur+2]-i+10)%10) +t);
}
return dp[cur][t1][t2] = ans;
} int main()
{
while(scanf("%s%s",str1,str2) != EOF)
{
len= strlen(str1);
for(int i = 0; i < len; i++)
{
a[i] = str1[i] - '0';
b[i] = str2[i] - '0';
}
a[len] = a[len+1] = b[len] = b[len+1] = 0;
memset(dp,-1,sizeof(dp));
printf("%d\n",DFS(0,a[0],a[1]));
}
return 0;
}
习题9-8 uva1631的更多相关文章
- Sharepoint学习笔记—习题系列--70-576习题解析 --索引目录
Sharepoint学习笔记—习题系列--70-576习题解析 为便于查阅,这里整理并列出了70-576习题解析系列的所有问题,有些内容可能会在以后更新. 需要事先申明的是: 1. ...
- 《python核心编》程课后习题——第三章
核心编程课后习题——第三章 3-1 由于Python是动态的,解释性的语言,对象的类型和内存都是运行时确定的,所以无需再使用之前对变量名和变量类型进行申明 3-2原因同上,Python的类型检查是在运 ...
- 习题 5: 更多的变量和打印 | 笨办法学 Python
一. 简述 “格式化字符串(format string)” - 每一次你使用 ' ’ 或 " " 把一些文本引用起来,你就建立了一个字符串. 字符串是程序将信息展示给人的方式. ...
- 【WebGoat习题解析】Parameter Tampering->Bypass HTML Field Restrictions
The form below uses HTML form field restrictions. In order to pass this lesson, submit the form with ...
- python核心编程(第二版)习题
重新再看一遍python核心编程,把后面的习题都做一下.
- SQL简单语句总结习题
创建一个表记员工个人信息: --创建一个表 create table plspl_company_info( empno ) not null, ename ) not null, job ), ma ...
- 《Python核心编程》部分代码习题实践(持续更新)
第三章 3-10 交换异常处理方式 代码: #makeTextFile.py #!/usr/bin/env python 'makeTextFile.py' import os ls = os.lin ...
- web实验指导书和课后习题参考答案
实验指导书 :http://course.baidu.com/view/daf55bd026fff705cc170add.html 课后习题参考答案:http://wenku.baidu.com/li ...
- 《C++primer》v5 第1章 开始 读书笔记 习题答案
从今天开始在博客里写C++primer的文字.主要以后面的习题作业为主,会有必要的知识点补充. 本人也是菜鸟,可能有不对之处,还望指出. 前期内容可能会比较水. 1.1略 1.2略 1.3 cin和c ...
随机推荐
- PID控制示例C编程
typedef struct PID_zhs { double P,I,D;//P.I.D系数 float curError;//当前误差 float lastError;//上次误差 float p ...
- linux下安装配置jdk(解压版)
在linux下登录oracle官网,下载解压版jdk 传送门 系统默认下载到"下载"目录中 创建要将该文件解压的文件夹: 其中 -p 参数代表递归创建文件夹(可以创建多级目录 ...
- Ajax 调用webservice 解决跨域请求和发布到服务器后本地调用成功外网失败的问题
webservice 代码 /// <summary> /// MESService 的摘要说明 /// </summary> [WebService(Namespac ...
- 启动mongodb遇到的错:warning: 32-bit servers don't have journaling enabled by deflity
执行修复:mongod --repair即可 正常关闭:killall mongod
- 利用JavaScript去掉数组中重复项
利用JavaScript的object的特性,我们可以非常容易的实现将一个数组的重复项去掉. object的特性是:key一定是唯一的. 把数组重复项去掉: 1 将数组转换成一个object对象,数组 ...
- 测试驱动开发实践5————testSave之修改文档分类
[内容指引] 1.确定"修改文档分类"的微服务接口及所需的参数 2.设计测试用例及测试用例合并 3.为测试用例赋值并驱动开发 上一篇我们通过17个测试用例完成了"新增文档 ...
- Text-文本检查
#检查文本 from tkinter import * import hashlib master=Tk() text = Text(master,width=30,height=5) text.pa ...
- Google Cardboard的九轴融合算法——基于李群的扩展卡尔曼滤波
Google Cardboard的九轴融合算法 --基于李群的扩展卡尔曼滤波 极品巧克力 前言 九轴融合算法是指通过融合IMU中的加速度计(三轴).陀螺仪(三轴).磁场计(三轴),来获取物体姿态的方法 ...
- 【SQL.基础构建-第二节(2/4)】
-- Tips:查询基础 --一.SELECT 语句基础-- 1.查询指定列:SELECT 关键字--语法:--SELECT <列名>, ... -- 希望查询列的名称- ...
- Thread源码剖析
前言 昨天已经写了: 多线程三分钟就可以入个门了! 如果没看的同学建议先去阅读一遍哦~ 在写文章之前通读了一遍<Java 核心技术 卷一>的并发章节和<Java并发编程实战>前 ...