去年天津regional的题,就因为这题打铁的。做了一年,惭愧啊。

给出两个由数字组成的串,问最少通过几次操作能使第一个变成第二个。操作为将连续的1-3长度的子串的每一位数字同时加一或减一。

首先,最短路的话,状态数太多。那么dp的时候,最重要的就是要考虑后效性的问题。可以把后效性枚举出来,反正就两位。

dp[i][a][b]表示是前i位和第二个字符串一样,同时第i+1和i+2个字符为a和b所用的最少的步数。

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;void checkmin(int & x, int y) { if(x > y) x = y; }const int maxn = 1000 + 10;
const int inf = 0x3f3f3f3f;
char str1[maxn], str2[maxn];
int num1[maxn], num2[maxn];
int dp[maxn][15][15];
int n;void prework()
{n = strlen(str1);memset(dp, 0x3f, sizeof(dp));for(int i = 0; i < n; ++i){num1[i + 1] = str1[i] - '0';num2[i + 1] = str2[i] - '0';}num1[n + 1] = num1[n + 2] = num2[n + 1] = num2[n + 2] = 0;dp[0][num1[1]][num1[2]] = 0;
}int tran(int a, int b)
{int ans = (a + b) % 10;if(ans < 0) ans += 10;return ans;
}void solve()
{for(int i = 1; i <= n; ++i){for(int a = 0; a < 10; ++a){for(int b = 0; b < 10; ++b){if(dp[i - 1][a][b] == inf) continue;int pre = dp[i - 1][a][b];int tmp = (num2[i] - a + 10) % 10;for(int j = 0; j <= tmp; ++j)for(int k = j; k <= tmp; ++k)checkmin(dp[i][tran(b, k)][tran(num1[i + 2], j)], pre + tmp);tmp = (10 - tmp) % 10;for(int j = 0; j <= tmp; ++j)for(int k = j; k <= tmp; ++k)checkmin(dp[i][tran(b, -k)][tran(num1[i + 2], -j)], pre + tmp);}}}int ans = inf;for(int i = 0; i < 10; ++i) for(int j = 0; j < 10; ++j) checkmin(ans, dp[n][i][j]);printf("%d\n", ans);
}int main()
{freopen("in.txt", "r", stdin);while(~scanf("%s %s", str1, str2)){prework();solve();}return 0;
}

hdu4433——dp相关推荐

  1. dp hdu-4433 locker

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4433 题目大意: 给两个长度相等的数字串s1,s2.每次操作可以把连续的最多三位都+1或-1,如果超 ...

  2. dp,sp,px相互转化

    方法一: public int sp2px(float sp) {return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, ...

  3. [JS][dp]题解 | #打家劫舍(一)#

    题解 | #打家劫舍(一)# 题目链接 打家劫舍(一) 题目描述 描述 你是一个经验丰富的小偷,准备偷沿街的一排房间,每个房间都存有一定的现金,为了防止被发现,你不能偷相邻的两家,即,如果偷了第一家, ...

  4. HDU 2084 数塔(DP)(JAVA版)

    数塔 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...

  5. dp cf 20190615

    A. Timofey and a tree 这个不算是dp,就是一个思维题,好难想的思维题,看了题解才写出来的, 把点和边分开,如果一条边的两个点颜色不同就是特殊边,特殊边两边连的点就叫特殊点, 如果 ...

  6. BZOJ 1003[ZJOI2006]物流运输(SPFA+DP)

    Problem 1003. -- [ZJOI2006]物流运输 1003: [ZJOI2006]物流运输 Time Limit: 10 Sec  Memory Limit: 162 MB Submit ...

  7. [NOI2005]聪聪与可可(期望dp)

    题意:给一张无向图,有一只猫和一只老鼠,猫每秒会向老鼠的方向移动两个单位,若它们的距离为一,那么只会移动一个单位,老鼠会等概率向周围移动一步或不动,求猫抓到老鼠的期望时间. Solution luog ...

  8. Codeforces 903F Clear The Matrix(状态压缩DP)

    题目链接 Clear The Matrix 题意 给定一个$4 * n$的矩形,里面的元素为$'.'$或$'*'$.现在有$4$种正方形可以覆盖掉$'*'$,正方形的边长分别为$1,2,3,4$. 求 ...

  9. 喵哈哈村的魔法考试 Round #1 (Div.2) 题解源码(A.水+暴力,B.dp+栈)

    A.喵哈哈村的魔法石 发布时间: 2017年2月21日 20:05   最后更新: 2017年2月21日 20:06   时间限制: 1000ms   内存限制: 128M 描述 传说喵哈哈村有三种神 ...

最新文章

  1. Python中logging.config配置文件解读
  2. 3 账套升级u8_用友U8条码管理的应用对仓库有什么好处?
  3. 6.1 引言-系统数据文件和信息
  4. EF Core的一个紧急bug,我这样修改
  5. I must be strong and carry on
  6. java cookie安全_cookie的安全性问题
  7. android 进度条 代码,Android 进度条使用详解及示例代码
  8. java -jar debug_java – 如何在运行时调试jar?
  9. 设计模式系列 12-- 职责链模式
  10. MySQL 之事务 及 其隔离级别
  11. LQR控制算法及代码实践
  12. 单片机原理及接口技术
  13. 微带滤波器摘要_微带线带通滤波器设计
  14. ASM Is Unable To Detect SCSI Disks On Windows. [ID 880061.1]
  15. matlab 求隐含波动率,matlab求解资产隐含波动率及无风险利率初探.doc
  16. java 注解 @Deprecated
  17. PyTorch搭建LSTM实现多变量多步长时间序列预测(四):多模型滚动预测
  18. 用python 打印等腰三角形
  19. antd vue实现日历功能——添加放假时间功能——基础积累
  20. (2021年)IT技术分享社区个人文章汇总(编程技术篇)

热门文章

  1. 小米(MI) CXB6-1QM 米家插线板 6位基础版拆解暴力维修
  2. php搜索功能实现,PHP 搜索查询功能实现
  3. 何止是糟糕【和移动i8】
  4. 10、弱电综合布线系统,机房系统,UPS系统知识技能资料归纳1
  5. shopee的八个站点,新手从哪开始?
  6. Redis Key 统一管理技巧
  7. stroop效应matlab实验
  8. 【撷英采华】学员日考题-071801
  9. 无线WiFi远距离通信传输,无线WiFi模组技术,CV5200模块应用
  10. excel自动排班有假期_Excel中的假期周末标志