HDU 4433 locker
来源:互联网 发布:问答软件名字 编辑:程序博客网 时间:2024/04/26 20:44
Problem 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 last 3 digits up)
000000 -> 000900 (by rotating the 4th digit down)
Given the current state and the secret password, what is the minimum amount of steps you have to rotate the locker in order to get from current state to the secret password?
You can rotate 1-3 consecutive digits up or down in one step.
For examples:
567890 -> 567901 (by rotating the last 3 digits up)
000000 -> 000900 (by rotating the 4th digit down)
Given the current state and the secret password, what is the minimum amount of steps you have to rotate the locker in order to get from current state to the secret password?
Input
Multiple (less than 50) cases, process to EOF.
For each case, two strings with equal length (≤ 1000) consists of only digits are given, representing the current state and the secret password, respectively.
For each case, two strings with equal length (≤ 1000) consists of only digits are given, representing the current state and the secret password, respectively.
Output
For each case, output one integer, the minimum amount of steps from the current state to the secret password.
Sample Input
111111 222222896521 183995
Sample Output
212
f[now][i][j]表示从第1位到第now位全部已经对上且现在第now+1位是i,第now+2位是j的最少步数,然后递推转移即可
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=1005;char s1[maxn],s2[maxn];int f[maxn][10][10],n,a[maxn],b[maxn],ans;void get(int a,int b,int c,int x){ if (f[a][b][c]<0) f[a][b][c]=x; else f[a][b][c]=min(f[a][b][c],x);}int main(){ while (~scanf("%s%s",s1,s2)) { n=strlen(s1); ans=9*n; for (int i=1;i<=n;i++) a[i]=s1[i-1]-'0',b[i]=s2[i-1]-'0'; a[n+1]=a[n+2]=b[n+1]=b[n+2]=0; for (int i=0;i<=n;i++) memset(f[i],-1,sizeof(f[i])); f[0][a[1]][a[2]]=0; for (int now=0;now<n;now++) { int end=a[now+3]; for (int i=0;i<10;i++) { int up=(b[now+1]-i+10)%10; int dw=(i-b[now+1]+10)%10; for (int j=0;j<10;j++) if (f[now][i][j]>=0) { for (int k=0;k<=up;k++) for (int kk=0;kk<=k;kk++) get(now+1,(j+k)%10,(end+kk)%10,f[now][i][j]+up); for (int k=0;k<=dw;k++) for (int kk=0;kk<=k;kk++) get(now+1,(10+j-k)%10,(10+end-kk)%10,f[now][i][j]+dw); } } } for (int i=0;i<10;i++) for (int j=0;j<10;j++) if (f[n][i][j]>=0) ans=min(f[n][i][j],ans); printf("%d\n",ans); } return 0;}
0 0
- HDU locker 4433
- HDU 4433 locker
- dp hdu-4433 locker
- HDU 4433 locker
- [HDU 4433]locker[DP]
- hdu 4433 locker(DP)
- HDU 4433 locker
- hdu 4433 Locker dp
- hdu 4433—— locker
- hdu 4433 locker(DP)
- HDU 4433 locker (线性dp)
- HDU 4433 locker(三维dp)
- HDU 4433 locker(DP)
- hdu 4433(uva1631) - Locker - dp
- Hdu 4433 locker【思维+Dp】
- HDU 4433 locker(DP)( UVA 1631 - Locker)
- hdu 4433 locker(动态规划)
- hdu 4433 locker(DP,4级)
- HDU 4436 str2int
- 第6周项目3-括号的匹配
- X210烧写linux系统
- hdu4750Count The Pairs 并查集
- xUtils 源码解析
- HDU 4433 locker
- Letter Combinations of a Phone Number
- igrimaceV8.0.0 IG (三个插件安装方式)
- 达内学习日志Day20:Java核心API(Map初体验)
- Linux网络编程---ICMP协议分析及ping程序实现
- 数组中未出现的最小正整数
- 二级指针
- SparkSQL之数据源
- AFN文档中文翻译以及简单使用说明