题意

给1000个数字,每次可以转动1-3连续位,问从一个状态转到另一个状态最少需要多少步。

题解

比赛时候想复杂了,这道题跟BFS没有任何关系。不过还是有很多神牛用记忆化搜索过了。主要就是设计DP状态,网上有一种比较好想的状态,dp[i][j][k]代表第i个位置已经合法了,j代表第i+1个位置向上转动了j步,k代表第i+2个位置向上转动了k步。这样的话,我们就可以很轻松的进行状态转移。

注意事项

唯一需要特别注意的是在状态转移的过程中需要取模,因为操作之后会出现>=10以及<0的情况,需要进行取模处理。

代码

#include<bits/stdc++.h>
#define UP(i,l,h) for(int i=l;i<h;i++)
#define DOWN(i,h,l) for(int i=h-1;i>=l;i--)
#define W(t) while(t)
#define MEM(a,b) memset(a,b,sizeof(a))
#define LL long long
#define INF 0x3f3f3f3f
#define eps 1e-10
#define MAXN 1010
#define MOD 1000000007
#define COUT(x) cout<<x<<endl
using namespace std;
char s1[MAXN],s2[MAXN];
int i1[MAXN],i2[MAXN];
int dp[MAXN][15][15];
int main() {W(~scanf("%s%s",s1,s2)) {int len=strlen(s1);MEM(dp,INF);dp[0][0][0]=0;UP(k,0,len) {UP(i,0,10) {UP(j,0,10) {int up=(s2[k]-s1[k]-i+20)%10;
//                    COUT(k<<" "<<i<<" "<<j<<" "<<up);int down=10-up;
//                    COUT(up<<" "<<down);UP(p,0,up+1) {UP(q,0,p+1) {dp[k+1][(j+p)%10][q]=min(dp[k+1][(j+p)%10][q],dp[k][i][j]+up);}}UP(p,0,down+1) {UP(q,0,p+1) {dp[k+1][(j-p+10)%10][(10-q)%10]=min(dp[k+1][(j-p+10)%10][(10-q)%10],dp[k][i][j]+down);}}}
//            COUT(k);}}printf("%d\n",dp[len][0][0]);}
}

HDU 4433 DP相关推荐

  1. HDU 5928 DP 凸包graham

    给出点集,和不大于L长的绳子,问能包裹住的最多点数. 考虑每个点都作为左下角的起点跑一遍极角序求凸包,求的过程中用DP记录当前以j为当前末端为结束的的最小长度,其中一维作为背包的是凸包内侧点的数量.也 ...

  2. hdu 1171 dp(多重背包)

    View Code //hdu 1171 dp(多重背包)//题意:把所有物品的价值尽量分为相等的两份,不能等分的话 //后面那份可以稍小于前面的 //求出价值总和后,令价值的一半为背包容量,让背包尽 ...

  3. hdu 4433 locker(DP)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=4433 题目大意:就是给你一个序列,相当于一个可以转的那种密码锁的初始状态,0往下转是9,9往上转是0,现在 ...

  4. [HDU 4433]locker[DP]

    题意: 给出密码做的现状和密码, 每次可以移动连续的最多3列, 向上或向下, 求将密码调出来所需要的最少步数. 思路: 首先应看出,恢复的过程中, 调每一位的时间顺序是不影响的, 不妨就从左到右一位位 ...

  5. UVA 1631 Locker(HDU 4433)(DP)

    A password locker with N digits, each digit can be rotated to 0-9 circularly. You can rotate 1-3 con ...

  6. hdu 4433 locker

    http://acm.hdu.edu.cn/showproblem.php?pid=4433 记忆化搜索+DP ans[x][f][ff]; 表示到a的第x位时 此位加f ,x-1位 加ff 的情况下 ...

  7. HDU 4832(DP+计数问题)

    HDU 4832 Chess 思路:把行列的情况分别dp求出来,然后枚举行用几行.竖用几行,然后相乘累加起来就是答案 代码: #include <stdio.h> #include < ...

  8. hdu 5086(dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5086 题目大意:给出长度为n的数组,然后要求累计里面的每个子串的和. 解题思路:这道题直接枚举肯定不行 ...

  9. hdu 2059(dp)

    龟兔赛跑 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Des ...

最新文章

  1. task_struct源码
  2. 类型后面的问号的目的是什么(例如:int?myVariable)?
  3. 托管数据中心之间的PUE比较(下)
  4. 数据结构与算法 / 红黑树
  5. 为什么用 windbg 看 !address 显示出的Free是128T 大小?
  6. ubuntu+eclipse+svn
  7. 安卓软件错误log_关于android程序的log错误信息的问题,请明白人看下吧,我是初学者,新建的android项目,一个代码都没改过...
  8. catia利用宏批量改名的方法_谁有CATIA批量改名的宏程序啊
  9. Usually, these regular meetings do not have
  10. IT职业生涯中的必修课
  11. 北漂程序员,何以露宿街头?
  12. Java学习笔记目录索引 (持续更新中)
  13. 三组计算机局域网组网方案,多种方式组建家庭局域网
  14. 数据安全合规体系建设白皮书
  15. 深圳大学计算机系在哪个校区,2021年深圳大学有几个校区,大一新生在哪个校区...
  16. Nginx的 HTTP 499 状态码处理
  17. windbg挂代理下载pdb
  18. java后端微信小程序登录与注册
  19. 千里马android framework开发解决Accessing hidden method限制,让应用访问隐藏方法(需要可以修改系统源码方案)
  20. SWUST OJ#1052 输出利用先序遍历创建的二叉树中的指定结点的双亲结点

热门文章

  1. Qt 实现鼠标拖拽窗口移动
  2. php编程 地位,4月编程语言排行榜_4月编程语言排行榜:java地位无可撼动,Python跌出前三...
  3. shell调用spark不执行JAVA,当代码在Spark shell中工作时,spark-submit不能引用“--jars”指定的jar?...
  4. java怎么调用同包变量,Java并发包中的原子变量操作类
  5. html css加载不了_前端面试准备笔记之html和css(03)
  6. 视频画质增强器--v1.0
  7. 安卓市场上哪个便签好用 比较好用的便签软件推荐
  8. JPush极光消息推送APP-start
  9. echarts 柱状图形状修改成等腰三角形
  10. 【常用传感器】SW-420震动传感器原理及例程代码