Codeforces 264B Good Sequences ★ (分解素因子+DP)
生活随笔
收集整理的這篇文章主要介紹了
Codeforces 264B Good Sequences ★ (分解素因子+DP)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接:http://codeforces.com/problemset/problem/264/B 題目大意:給定一個數列a1,a2,a3,a4,……,an(數據保證ai嚴格遞增,n<=10^5),求最長的good序列長度:①序列嚴格遞增 ?②序列相鄰兩數不能互素. ? 題目乍一看好像是nlogn二分+DP的最長上升子序列,但其實這題和LIS一點兒關系都沒有……因為數列本身就是嚴格遞增的. 但是此題還需要借鑒LIS的思想,獨特的是我們把素因子作為DP的狀態,c[pi]表示前面以素數pi為因子的數結尾的最長序列的長度,f[i]表示以第i個數結尾的最長序列的長度。然后我們從左到右掃描序列,每次對當前第i個數分解素因子p1,p2,p3,……pn,找到其中c[pi]最大的,那么我們把此數連到該序列尾便形成了以該數為結尾的最長的good序列。注意完了之后還需要再更新各c[pi]。 ?
#include
#include
#include
#include
using namespace std;
#define MAX 100010
int a[MAX],f[MAX],c[MAX];
bool noprime[MAX];
vector prime;
int gcd(int a, int b){return b?gcd(b, a%b):a;
}
void Prime(){for (int i = 2; i <= 100000; i ++){if (!noprime[i]){prime.push_back(i);}for (int j = 0; j < prime.size() && prime[j] * i <= 100000; j ++){noprime[prime[j]*i] = 1;if (i % prime[j] == 0) break;}}
}
int main(){Prime();int n;cin >> n;for (int i = 0; i < n; i ++){cin >> a[i];int tmp = a[i];f[i] = 1;for (int j = 0; j < prime.size(); j ++){int p = prime[j];if (p * p > tmp)break;if (tmp % p == 0){f[i] = max(f[i], c[p] + 1);while(tmp % p == 0)tmp /= p;}}if (tmp > 1){f[i] = max(f[i], c[tmp] + 1);}for (int j = 0; j < prime.size(); j ++){int p = prime[j];if (p * p > a[i])break;if (a[i] % p == 0){c[p] = f[i];while(a[i] % p == 0)a[i] /= p;}}if (a[i] > 1){c[a[i]] = f[i];}}int maxn = 1;for (int i = 0; i < n; i ++)if (f[i] > maxn)maxn = f[i];cout << maxn << endl;
}
?
轉載于:https://www.cnblogs.com/AbandonZHANG/archive/2013/01/21/4114202.html
總結
以上是生活随笔為你收集整理的Codeforces 264B Good Sequences ★ (分解素因子+DP)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GCD介绍(一): 基本概念和Dispa
- 下一篇: 鱼雷的速度超过音速还怎么利用声呐制导?