POJ1745

来源:互联网 发布:git 下常用linux命令 编辑:程序博客网 时间:2024/05/20 05:24

Problem: Divisibility
Description: 给你一串序列。现在要你在这些序列中间添加上+号。似的这个算式的结果可以被k整除。
Solution: dp, 这也是我想了一天才想到的,果然还是太弱了。dp[i][j]表示前i个数的结果能否被j整除。那么状态转移方程就是

dp[i][j]=(dp[i1][(ja[i]+k)%k]||dp[i1][(j+a[i])%k])

不过我们还得对这些数进行预处理。把每个数都变成正数,并且每个数都mod(k)

Code(JAVA):

import java.util.*;public class Main{    Scanner cin=new Scanner(System.in);    static final int M=10000+5;    static final int E=100+5;    int n,k;    int[] a=new int[M];    boolean[][] dp=new boolean[M][E];    Main(){        while(cin.hasNext()){            n=cin.nextInt();            k=cin.nextInt();            for(int i=0;i<n;i++){                a[i]=cin.nextInt();                a[i]=(a[i]<0? -a[i]:a[i]);                a[i]%=k;            }            for(int i=0;i<M;i++)                for(int j=0;j<E;j++)                    dp[i][j]=false;            dp[0][a[0]]=true;            for(int i=1;i<M;i++)                for(int j=0;j<k;j++)                    dp[i][j]=(dp[i-1][(j-a[i]+k)%k]||dp[i-1][(j+a[i])%k]);            System.out.println(dp[n-1][0]? "Divisible":"Not divisible");        }    }    public static void main(String[] args){        new Main();    }}
0 0