uva 1631——Locker
生活随笔
收集整理的這篇文章主要介紹了
uva 1631——Locker
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:有一個n位的密碼鎖,每位都是0——9可以循環旋轉,每次可以往上或者往下旋轉一下,然后給定初始狀態和末狀態求最小旋轉步數。
思路:遞推,dp(i,x,y)表示翻到i位第i+1位為x,第i+2位為y的最小步數,枚舉上翻狀態,找到正翻和倒翻的最小值。
code:
#include <bits/stdc++.h> using namespace std;#define cls(a,c) memset(a,c,sizeof (a)) #define ft(i,s,t) for (int i=s;i<=t;i++) const int N=12,M=1005;char s[M],t[M]; int a[M],b[M]; int dp[M][N][N];int main() {while (~scanf("%s %s",s,t)){int n=strlen(s);ft(i,1,n) a[i]=s[i-1]-'0',b[i]=t[i-1]-'0';a[n+1]=b[n+1]=a[n+2]=b[n+2]=0;cls(dp,63);//ft(i,1,n) printf("%d",b[i]);dp[0][a[1]][a[2]]=0;ft(i,1,n) ft(x,0,9) ft(y,0,9){int d=(b[i]-x+10)%10;ft(j,0,d) ft(k,0,j)dp[i][(y+j)%10][(a[i+2]+k)%10]=min(dp[i][(y+j)%10][(a[i+2]+k)%10],dp[i-1][x][y]+d);int p=10-d;ft(j,0,p) ft(k,0,j)dp[i][(y-j+10)%10][(a[i+2]-k+10)%10]=min(dp[i][(y-j+10)%10][(a[i+2]-k+10)%10],dp[i-1][x][y]+p);}printf("%d\n",dp[n][0][0]);} }總結
以上是生活随笔為你收集整理的uva 1631——Locker的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 成都大熊猫繁育研究基地观光车票价
- 下一篇: 成都大熊猫繁育研究基地坐几号线