Locker UVA

来源:互联网 发布:安卓好用的拼长图软件 编辑:程序博客网 时间:2024/06/08 01:12

动态规划的一道题目,利用dp[i][m][n][k],表示目前处理的是源串的第i位的数字,同时源串第i位的数字为m,i+1位的数字为n,第i+2位的数字为k。那么就可以找到对应目标串的第i位数字,从而开始"尝试"每一种的旋转方法,记录并且进行相应的更新即可,具体实现见如下代码:

package a;//实际提交的时候记得去掉包名import java.util.Arrays;import java.util.Scanner;public class Main {    String s;    String s1,s2;    int visit[][][][]=new int[1010][10][10][10];    int dp[][][][]=new int[1010][10][10][10];    int record;    int Inf=1<<20;    int L;    public int DP(int i,int m,int n,int k){        if(i>=L) return 0;        if(visit[i][m][n][k]==record) return dp[i][m][n][k];        visit[i][m][n][k]=record;        int aim=s2.charAt(i)-'0';        int ans=Inf;        if(m>aim){            int up=m-aim;            for(int up1=0;up1<=up;up1++){                for(int up2=0;up2<=up1;up2++){                    int newn=(n-up1+10)%10;                    int newk=(k-up2+10)%10;                    int k2=s1.charAt(i+3)-'0';                    ans=Math.min(ans,DP(i+1,newn,newk,k2)+up);                }            }            int down=10-up;            for(int down1=0;down1<=down;down1++){                for(int down2=0;down2<=down1;down2++){                    int newn=(n+down1)%10;                    int newk=(k+down2)%10;                    int k2=s1.charAt(i+3)-'0';                    ans=Math.min(ans,DP(i+1,newn,newk,k2)+down);                }            }        }else{//m<=aim            int down=aim-m;            for(int down1=0;down1<=down;down1++){                for(int down2=0;down2<=down1;down2++){                    int newn=(n+down1)%10;                    int newk=(k+down2)%10;                    int k2=s1.charAt(i+3)-'0';                    ans=Math.min(ans,DP(i+1,newn,newk,k2)+down);                }            }            int up=10-down;            for(int up1=0;up1<=up;up1++){                for(int up2=0;up2<=up1;up2++){                    int newn=(n-up1+10)%10;                    int newk=(k-up2+10)%10;                    int k2=s1.charAt(i+3)-'0';                    ans=Math.min(ans,DP(i+1,newn,newk,k2)+up);                }            }        }        dp[i][m][n][k]=ans;        return ans;    }    public void Solve(){        Scanner scan=new Scanner(System.in);        for(int i=0;i<1010;i++) {            for (int j = 0; j < 10; j++) {                for(int k=0;k<10;k++) {                    Arrays.fill(visit[i][j][k], -1);                }            }        }        record=0;        while(scan.hasNext()){            s=scan.nextLine();            int ind=s.indexOf(' ');            s1=s.substring(0,ind);            s2=s.substring(ind+1);            L=s1.length();            s1+="000";            s2+="000";            record++;            System.out.println(DP(0,s1.charAt(0)-'0',s1.charAt(1)-'0',s1.charAt(2)-'0'));        }    }    public static void main(String[] args){        Main a=new Main();        a.Solve();    }}

原创粉丝点击