乘积为特定值的子集和个数的动态规划-TopCoder-SRM632-DIV2-1000pt

题目见:

http://community.topcoder.com/stat?c=problem_statement&pm=13396&rd=16075

这道题没做上太可惜了,方法都想到了,只需要使用map<pair<int,int>,int>作为memo或者DP的规划表就可以了,并且十分简单。

typedef pair<int,int> scPair;
const int MODULAR=1000000007;
int m,n;

class GoodSubset
        { 
        public: 
            vector <int> d;
            map <scPair,int> cm;
            int Solve(int p,int x){
                if (p==0){return (x==1);}
                if (cm.find(scPair(p,x))!=cm.end()){return cm[scPair(p,x)];}
                int res=0;
                if (x % d[p-1]==0){
                    res+=Solve(p-1,x/d[p-1]);
                }
                res+=Solve(p-1,x);
                res%=MODULAR;
                cm[scPair(p,x)]=res;
                return res;
            }
        int numberOfSubsets(int goodValue, vector <int> d) 
            { 
                this->d=d;
                n=d.size();
                cm.clear();
                if (goodValue ==1){
                    return Solve(n,goodValue)-1;
                }
                return Solve(n,goodValue);
            } 
};

 

posted @ 2014-09-19 16:38  zombies  阅读(216)  评论(0编辑  收藏  举报