博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 4433 locker
阅读量:4987 次
发布时间:2019-06-12

本文共 897 字,大约阅读时间需要 2 分钟。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4433

这是一道2012年ACM天津赛区现场赛的题目,大意是给出两串数字,求用最少的转换次数将一串(A)变为另一串(B)。

转换规则是:可以将连续的1到3位数字都加一或者减一(0-9的数字是循环的,0减一变9,9加一变0)

本题的数字串的长度最大有1000,光用搜索是不行的了,正解是DP

DP[i][j][k]表示前i-2个数字与目的串的相同,且第i-1位为j , 第i 位为k 的最小变换次数。

那么状态的转移就是 DP[i][j][k]=min{DP[i-1][ X ][ Y ]+dis(A[i],K)} ,其中dis(A[i],K)表示从A[i]变为K所需的变化次数,不难知道变化可以往上变化,也可以往下变化,所以有两种情况;X表示在变化次数不超过dis(A[i],K)和Y的变化次数的情况下能变成B[i-2] 的数字,Y表示在变化次数不超过dis(A[i],K)的情况下能变成 J 的数字,X和Y都需要根据当前dis(A[i],K)的计算状态(向上向下)来定。

X、Y的变化次数有所限制,是以第i位的变化次数为标准,这样可以保证枚举到所有连续变化的情况,比如说234的次数和444的次数是一致的。对于每一位数都能找到一种满足这种条件的方案使得穷尽与这位和相临的2位的各种组合情况。

这题能用动态规划的关键是每次变化的数字位一定是连续的,这为无后效性和最优子结构提供支持。状态的转移比较麻烦。

代码:

1 #include 
2 #include
3 char a[1280],b[1280]; 4 int dp[1280][10][10]; 5 bool ifv[1280][10][10]; 6 inline int min(int a,int b){
return a
View Code

 

 

转载于:https://www.cnblogs.com/wuminye/p/3238510.html

你可能感兴趣的文章
(二)Solr——Solr界面介绍
查看>>
getLocation 需要在 app.json 中声明 Permission 字段
查看>>
基于opencv和mfc的摄像头采集代码(GOMFCTemplate2)持续更新
查看>>
eclipse中如何打开工作空间里面已经有的项目
查看>>
游戏时区问题小解
查看>>
Linux下用户和用户组的创建(翻译)
查看>>
Python中文编码深入解析
查看>>
jsp自定义标签
查看>>
数据库启动步骤
查看>>
完全认识树状数组
查看>>
SpringCloud之旅第一篇-微服务概念
查看>>
管理信息系统课程设计
查看>>
STM32F103移植uCOSIII始终卡在PendSV或Systick处解决办法
查看>>
【Tomcat 6.0官方文档翻译】—— 简介
查看>>
Mongodb部署
查看>>
配置当前用户使用豆瓣pip源
查看>>
Linux定时执行PHP
查看>>
如何创建响应的jQuery图像网格效果
查看>>
移动端input输入placeholder垂直不居中
查看>>
焦旭超201771010109《面向对象程序设计(java)》第七周学习总结
查看>>