codeforces 512B (map DP)
来源:互联网 发布:淘宝店铺小号怎么弄 编辑:程序博客网 时间:2024/05/18 01:19
题目链接:点击这里
题意:给出一堆数字,每个数字有一个花费和长度,表示花费多少钱就可以走这样的长度。初始在坐标原点,问能够走到所有的坐标的最少花费。
考虑取两个数,那么能够走到所有的点是两者gcd的倍数。所以只需要选择花费最少的数使得这些数的gcd=1。由于gcd数字比较大但是最多不会超过nlgn,所以直接用map记录每一种gcd的下标然后DP即可。
#include <bits/stdc++.h>using namespace std;#define maxn 305map <int, int> gg;int s[500005];int dp[500005], cnt;int n;int l[maxn], c[maxn];int main () { gg.clear (); cin >> n; for (int i = 1; i <= n; i++) cin >> l[i]; for (int i = 1; i <= n; i++) cin >> c[i]; memset (dp, -1, sizeof dp); int cnt = 0; for (int i = 1; i <= n; i++) { for (int j = 1; j <= cnt; j++) { int now = __gcd (s[j], l[i]); if (!gg.count (now)) { gg[now] = ++cnt; dp[cnt] = c[i]+dp[j]; s[cnt] = now; } else { dp[gg[now]] = min (dp[j]+c[i], dp[gg[now]]); } } if (!gg.count (l[i])) { gg[l[i]] = ++cnt; dp[cnt] = c[i]; s[cnt] = l[i]; } else { dp[gg[l[i]]] = min (dp[gg[l[i]]], c[i]); } } if (!gg.count (1)) { cout << "-1" << endl; return 0; } cout << dp[gg[1]] << endl; return 0;}
0 0
- codeforces 512B (map DP)
- 【dp】 Codeforces 2B
- Codeforces 2B (DP)
- CodeForces 407B DP
- Codeforces - 577B dp
- codeforces 587B(dp)
- codeforces 414B (DP)
- Codeforces 679B - dp
- Codeforces 577B(dp)
- codeforces 855B DP
- 字符串dp codeforces B
- Codeforces Beta Round #2 A map B dp C 模拟退火
- codeforces 240B - Fence DP
- Codeforces 258B 数位DP
- codeforces 414b(数位DP)
- DP 之 codeforces 416B
- codeforces 487B Strip dp
- 【DP】 codeforces 487B Strip
- C#编程基础(六)
- 1622-5 孔富晨 总结《2016年10月20日》 【连续第20天总结】
- Android内存优化(使用SparseArray和ArrayMap代替HashMap)
- 云计算工程师必备技能图谱
- 【openjudge 计算概论(A)】[编程练习(数组练习)]
- codeforces 512B (map DP)
- laravel---(II)---数据和模型起步篇
- 基于OpenCV的截图小程序
- UVA 10382 Watering Grass 区间覆盖问题 -
- POJ1990MooFest
- jpg格式转换成png格式
- 简单博弈论题目总结
- python连接mysql
- 1619-7 张良 十月二十号总结 [连续第二十天]