ZOJ 3644 Kitty's Game (记忆化搜索+hash)
2014-04-24 22:59
309 查看
OJ题目:click here~~
题目分析:经过结点i时,得分变成已有得分与i点值的最小公倍数,在每个结点,此值不能不变。问到达n结点时,得分变成K的路径数。1e6的约数很大 , 但是个数确很少,不到60个。所以状态可以简化为dp[ i ][ j ] , j为约数的id 。
AC_CODE
题目分析:经过结点i时,得分变成已有得分与i点值的最小公倍数,在每个结点,此值不能不变。问到达n结点时,得分变成K的路径数。1e6的约数很大 , 但是个数确很少,不到60个。所以状态可以简化为dp[ i ][ j ] , j为约数的id 。
AC_CODE
const int mod = 1000000007; vector <int> List[2001]; int num[2008]; int dp[2008][60]; int n , k , ans = 0; map <int , int> mp; inline int gcd(int x , int y){ return y == 0 ? x : gcd(y , x%y); } inline LL lcm(int x , int y){ return (LL)x / gcd(x , y) * y; } int dfs(int u , int score){ int id = mp[score]; if(dp[u][id] != -1) return dp[u][id]; LL ret = 0; for(int i = 0;i < List[u].size();i++){ int v = List[u][i]; LL LCM = lcm(score , num[v]); if(k%LCM ||LCM == score) continue; ret += dfs(v , LCM) , ret %= mod; } return dp[u][id] = ret; } int main() { int m , k , i , j , a, b ; while(scanf("%d%d%d",&n,&m,&k) != EOF){ for(i = 0;i <= n;i++) List[i].clear(); for(i = 0;i < m;i++){ scanf("%d%d",&a,&b) ; List[a].push_back(b) ; } for(i = 1;i <= n;i++) scanf("%d",&num[i]) ; if(k%num ){ puts("0") ; } else { List[0].push_back(1); int id = 0 ; mp.clear() ; for(i = 1;i * i <= k;i++){ if(k%i == 0){ mp[i] = id++ ; mp[k/i] = id++ ; } } memset(dp , -1 , sizeof(dp)) ; dp [mp[k]] = 1; cout << dfs(1 , num[1]) << endl; } } return 0; }
相关文章推荐
- zoj 3817 Chinese Knot(hash+暴力)
- Zoj 1671 Walking Ant(BFS+优先队列||记忆化搜索)
- ZOJ-#3518 Unsafe Factor(模拟+Hash)
- zoj 2672 Fibonacci Subsequence(hash + dp)
- zoj 1107 FatMouse and Cheese(动态规划 记忆化搜索)
- ZOJ:2672 Fibonacci Subsequence(动态规划+hash)
- zoj 1107 FatMouse and Cheese(记忆化搜索)
- ZOJ 2922 Bombs(记忆化搜索)
- ZOJ 1227 Free Candies(记忆化搜索)
- zoj 3644(dp + 记忆化搜索)
- ZOJ 3826 hash+字符串模拟
- ZOJ 3891 K-hash
- ZOJ3352【记忆化搜索】
- ZOJ 1107 FatMouse and Cheese(记忆化搜索)
- zoj 3211 dream city 贪心 dp和记忆化搜索
- zoj 1657 hash、、、
- HDU 4426 (ZOJ 3661) Palindromic Substring 后缀数组二分 + Manacher + Hash
- ZOJ 3644 Kitty's Game dfs,记忆化搜索,map映射 难度:2
- zoj_1101_Gamblers_枚举_hash
- ZOJ 3817 Chinese Knot (字符串HASH)