乘积为特定值的子集和个数的动态规划-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); } };