srm 302 div2 1000(简单题,bfs,dp)

来源:互联网 发布:淘宝网店铺装修教程 编辑:程序博客网 时间:2024/05/13 09:55

题意:
对于一个大于等于4的数K,可以加上它的一个因子(1,K除外)得到另一个数。
给N和M(N小于等于M),求从N到M的最小操作次数。
思路:
因为M<=100000,枚举因子是sqrt(K)
所以怎么搞都好啦~~

class DivisorInc{        public:        int countOperations(int N, int M)        {        memset(f, 0xff, sizeof(f));        f[N] = 0;        for (int i=N+2;i<=M;++i) {            int last = sqrt(i), tmp = inf;            for (int j=last;j>=2;--j) if (i%j == 0) {                if (i/j >= 3) {                    int from = i - j;                    if (f[from] != -1) {                        tmp = min (tmp, f[from]+1);                    }                }                if (j >= 3) {                    int from = i - i/j;                    if (f[from] != -1) {                        tmp = min (tmp, f[from]+1);                    }                }            }            if (tmp < inf) f[i] = tmp;        }        return f[M];        }};
0 0