码迷,mamicode.com
首页 > 其他好文 > 详细

SRM632 Div2 1000 DP

时间:2014-09-06 23:40:24      阅读:259      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   os   io   ar   for   art   

【题意】:

给你一个值v和一组数字,求在这组数字中有多少种可用的组合,可用的组合意思是组合中数字乘积等于这个v(不同位置的数组成的相同情况视为不同的解)。
【知识点】:DP
【题解】:

声明map<LL, LL> mp; 第一个元素代表能整除v的一个数,第二个元素代表数字组前i个元素中乘积为该数的集合数。

然后遍历这组数字,mp[v]的值即为答案。 当v为1时,要特判减1。

【代码】:

bubuko.com,布布扣
 1 #include <cstdio>
 2 #include <string>
 3 #include <vector>
 4 #include <map>
 5 using namespace std;
 6 
 7 #define LL long long
 8 
 9 class GoodSubset{
10 public:
11     map<int, int> mp;
12     int numberOfSubsets(int goodValue, vector <int> d){
13         const LL MOD = 1000000007;
14         map<LL, LL> mp;
15         mp[1] = 1;
16         map<LL, LL>::reverse_iterator it;
17         for(int i = 0; i < d.size(); i++){
18             LL val = d[i];
19             for(it = mp.rbegin(); it != mp.rend(); it++){
20                 LL z = it->first; z *= val;
21                 if(goodValue % z == 0){
22                     mp[z] = (mp[z] + it->second) % MOD;
23                 }
24             }
25         }
26         mp[1]--;
27         return mp[goodValue];
28     }
29 };
View Code

 

SRM632 Div2 1000 DP

标签:style   blog   http   color   os   io   ar   for   art   

原文地址:http://www.cnblogs.com/Ntcrush/p/3959913.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!